2013-12-19 108 views
3

解构地图看起来与我相反。任何人都可以解释发生了什么?为什么Clojure的地图解构看起来颠倒了?

我期望这是解构地图

的适当形式; =>(让[{:AA:BB} {:1:B 2}] [AB])

其中返回Exception Unsupported binding form: :a clojure.core/destructure/pb--4541 (core.clj:4029)。 Clojure文件说,以下是正确的方法。但它看起来键和值是颠倒的。

这应该是正确的方式:

; =>(让[{一个:AB:B} {:1:B 2}] [AB]) [1 2]

解构地图时发生了什么?

+1

参见https://groups.google.com/forum/#!msg/clojure/iLOY9e1sYzk/pSgT4w2g_YcJ –

回答

6

它并没有真正逆转,实际上它是有道理的。它说:将符号'a'绑定到与关键字关联的值:a

当您的地图使用关键字作为关键字时,您是否意识到这一点?

(let [{:keys [a b]} {:a 1 :b 2}] [a b]) 

更加整洁优雅!

如果您的密钥是符号或字符串,则存在其他变体。

+0

啊哈,我没有注意到我在使用符号。实际上'(def a 1)'意思是:将1赋给名为“a”的符号? – taro

+0

@taro它的意思是:绑定符号'a'的值为1 – Chiron

+0

Aha,这就是为什么'; =>(相同?'a'a)'应该是'false'的原因之一... – taro

0

而且,它使得这些区分案件:

cljs.user=> (let [{foo :foo :as bar} {:foo 3 :as 4}] [foo bar]) 
[3 {:foo 3, :as 4}] 
cljs.user=> (let [{foo :foo bar :as} {:foo 3 :as 4}] [foo bar]) 
[3 4] 
相关问题