2017-05-26 34 views
2

在使用dissoc時,我注意到它有一個似乎沒有任何操作的單一版本。我檢查了來源,事實證明這只是身份的功能:使用dissoc的一元版本?

(defn dissoc 
    ([map] map) 
    ([map key] 
    (. clojure.lang.RT (dissoc map key))) 
    ([map key & ks] 
    (let [ret (dissoc map key)] 
    (if ks 
     (recur ret (first ks) (next ks)) 
     ret)))) 

然後我注意到disj有一個一元的版本,以及使用相同的定義。

一元版本的目的是什麼?我可以看到的唯一潛在用途可能是當它們與apply一起使用時,但我不明白這將如何有用。爲什麼他們的conjassoc對應有相似的一元版本?

+0

考慮'(應用dissoc某些地圖項目去除)'。當'items-to-remove'爲空時,你是否真的*希望它是一個錯誤,從而迫使任何使用該習語的人將其包裝在條件中? –

+0

它和'+'也有0和1參數版本完全一樣。 –

+0

@CharlesDuffy這是一個很好的觀點。我認爲它沒有點擊,因爲我以前從未使用過任何功能。如果你寫一個答案,我會接受。 – Carcigenicate

回答

5

考慮(apply dissoc some-map items-to-remove)

如果一元表單不存在,則items-to-remove爲空將是一個錯誤,因此在進行此調用之前,需要始終檢查其長度。

+0

因此'conj'和'assoc'也應該是單一的身份。 JIRA門票是否會召喚? – Thumbnail

+0

@Thumbnail我想說''apply'與'conj'的任何用法都應該用['into']替換(https://clojuredocs.org/clojure.core/into)。對'assoc'使用'apply',似乎並不那麼簡單;你可以使用'#(進入%1(map vec(partition-all 2%2)))',但是這個時間比較長。 –

+2

@Thumbnail'conj'從1.7.0開始有一個一元超載。它在'(doc conj)'中被遮蔽了,因爲它確實是同時引入的空載超載。通過更新':arglists'(帶補丁)來修復這個問題的票:https://dev.clojure.org/jira/browse/CLJ-2169 –

相關問題