我正在做一個clojure excersice,這是一個問題。clojure地圖,什麼是%2和%1
(true? (__ :a {:a nil :b 2}))
的答案是:
#(nil?(%2 %1 0))
但我無法得到它。 %2%1 0在這裏做什麼? 尤其是,那0是做什麼的?
你能解釋一下嗎? 謝謝
我正在做一個clojure excersice,這是一個問題。clojure地圖,什麼是%2和%1
(true? (__ :a {:a nil :b 2}))
的答案是:
#(nil?(%2 %1 0))
但我無法得到它。 %2%1 0在這裏做什麼? 尤其是,那0是做什麼的?
你能解釋一下嗎? 謝謝
由於這是前面提到的, #(nil? (%2 %1 0))
是
(fn [a-map a-key] (nil? (a-map a-key 0)))
有幾件事情需要注意有關該行糖:
get
功能相同(a-map a-key default-value)
等於(get a-map a-key default-value)
nil
值區分。例如:(get {:b 1} :a)
產生nil
(如存在於地圖沒有:a
鍵)
(get {:a nil :b 1} :a)
也產生nil
(如nil
是:a
的值)
而使用默認值中移除了這種不確定性:
(get {:b 1} :a 0)
=> 0
(get {:a nil :b 1} :a 0)
=>零
:not-found
但在這種情況下,你可能會想要做的任務是這樣的:
(true? (#(contains? %2 %1) :a {:a nil :b 2}))
當他們顯然希望你檢查一下地圖中是否有鑰匙:a
不僅哈希映射,有序映射支持相同的函數語義。請參見[IPersistentMap的官方文檔](http://clojure.org/data_structures#Data%20Structures-Maps%20%28IPersistentMap%29)。 –
#()格式是定義匿名函數的簡寫。 例如:#(+ %1 %2)
是(fn [a,b] (+ a b))
這裏%2
和%1
等效表示第二和分別的第一個參數的函數。
THANKs,所以在這一行中:#(nil?(%2%1 0))是什麼意思?爲什麼有0? – BufBills
'0'將被用作默認返回值。例如,當地圖'%2'根本沒有與'℅1'匹配的關鍵字時。 –
不知道問題是什麼。什麼是__'? %2和%1是在##()函數中重複使用的佔位符。但我不明白他們會在這裏佔有什麼地位。也許你可以提供更多的細節? – jmargolisvt