我以为自己了解解构,但是我正在阅读Clojure博客,这使我感到困惑。如果您编写的函数如下所示:

(defn f [& {:keys [foo bar]}]
  (println foo " " bar))


为什么这样称呼它:

(f :foo 1 :bar 2)


我首先想到的是,我的函数应该这样调用:

(f {:foo 1 :bar 2})
IllegalArgumentException No value supplied for key: {:foo 1, :bar 2}  clojure.lang.PersistentHashMap.createWithCheck (PersistentHashMap.java:89)


但这显然行不通。我认为这与&的工作方式有关。但是我一直认为,它后面的东西是一个向量,因此您必须像它一样对它之后的任何东西进行解构。

有人可以向我解释此定义的工作方式/原因吗?谢谢

最佳答案

&和销毁表单按顺序工作:


&将其后的所有参数收集到集合中
然后,地图解构表单将使用该集合,并根据需要制作一个地图,并将名称绑定到向量中列出的键上。


地图解构形式中的向量仅是用于构建解构/绑定的语法,并不暗示输入形式

在defn中没有&的情况下,第二种形式将起作用,而第一种形式将不起作用。
使用&,第一个表格将起作用,第二个表格将不起作用。

关于clojure - 为什么可以将键值对传递给破坏映射的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16602507/

10-10 08:30