2015-10-02 75 views
2

我正在做一個clojure excersice,這是一個問題。clojure地圖,什麼是%2和%1

(true? (__ :a {:a nil :b 2})) 

的答案是:

#(nil?(%2 %1 0)) 

但我無法得到它。 %2%1 0在這裏做什麼? 尤其是,那0是做什麼的?

你能解釋一下嗎? 謝謝

+0

不知道問題是什麼。什麼是__'? %2和%1是在##()函數中重複使用的佔位符。但我不明白他們會在這裏佔有什麼地位。也許你可以提供更多的細節? – jmargolisvt

回答

2

由於這是前面提到的, #(nil? (%2 %1 0))

(fn [a-map a-key] (nil? (a-map a-key 0)))

有幾件事情需要注意有關該行糖:

  1. 哈希映射Clojure中的支持功能語義,使用地圖代替功能與呼叫get功能相同

(a-map a-key default-value)等於(get a-map a-key default-value)

  • 零作爲默認密鑰被添加到abscence的關鍵從鍵一個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

    +0

    不僅哈希映射,有序映射支持相同的函數語義。請參見[IPersistentMap的官方文檔](http://clojure.org/data_structures#Data%20Structures-Maps%20%28IPersistentMap%29)。 –

    7

    #()格式是定義匿名函數的簡寫。 例如:#(+ %1 %2)(fn [a,b] (+ a b))

    這裏%2%1等效表示第二和分別的第一個參數的函數。

    +0

    THANKs,所以在這一行中:#(nil?(%2%1 0))是什麼意思?爲什麼有0? – BufBills

    +1

    '0'將被用作默認返回值。例如,當地圖'%2'根本沒有與'℅1'匹配的關鍵字時。 –

    相關問題