2013-03-21 122 views
2

pop功能的文檔說:是否彈出拋出異常?

user> (doc pop) 
------------------------- 
clojure.core/pop 
([coll]) 
    For a list or queue, returns a new list/queue without the first 
    item, for a vector, returns a new vector without the last item. If 
    the collection is empty, throws an exception. 

但是我似乎無法重現,其中的異常應該拋出的行爲。

例如,在這裏我添加了三個元素到隊列中,然後是pop五次:根據文檔,這應該不起作用。然而,我沒有例外,我沒有。

(peek (pop (pop (pop (pop (pop (conj (conj (conj clojure.lang.PersistentQueue/EMPTY 4) 5) 6))))))) 

現在我喜歡的,而不是從空隊列試圖pop的時候,但我想明白爲什麼行爲從文檔的不同(至少從返回,而不是拋出一個異常的空隊列很多我通過閱讀文檔瞭解到)。

基本上我想知道我是否應該保護自己免受這裏的異常,或者如果我可以安全地假設空隊列總是返回一個空隊列(這與文檔相矛盾)。

回答

0

你是對的,在文檔字符串中似乎確實存在矛盾。目前,彈出一個空隊列給出一個空隊列。這樣看來,核心開發者辯論中​​期望的行爲所作的評論來看:

public PersistentQueue pop(){ 
    if(f == null) //hmmm... pop of empty queue -> empty queue? 
     return this; 
    //throw new IllegalStateException("popping empty queue"); 
    ISeq f1 = f.next(); 
    PersistentVector r1 = r; 
    if(f1 == null) 
     { 
     f1 = RT.seq(r); 
     r1 = null; 
     } 
    return new PersistentQueue(meta(), cnt - 1, f1, r1); 
} 

我不認爲自己安全的假設這種行爲絕不會在未來被改變。

+0

因此,如果我想採取防禦措施,我可以編寫一個* safe-pop *函數,它將使用* try */* catch *,並在引發異常時返回nil? – 2013-03-21 02:33:38

+0

我不知道試圖捕捉一個還不存在的異常(並且可能永遠不會)。我可能更傾向於測試自己的空洞,並且拋出異常或者返回零,因爲我認爲合適。 – 2013-03-21 03:06:04