将地图解构为函数输入

时间:2018-02-07 14:42:46

标签: clojure pattern-matching destructuring

让我们说我有一张简单的地图

(def mymap {:a 1 :b 2 :c 3 :d 4})

现在我想编写一个名为get-c的函数。此函数将mymap作为输入。既然我只对以下内容感兴趣:c是否有办法在输入阶段只获得c?我尝试了很多变化,但我总是遇到错误。 e.g。

(defn get-c [[{:keys [c]} input-map]] c) 

它确实编译但是当我尝试(get -c mymap)时我得到了

IllegalArgumentException Parameter declaration "mymap" should be a vector  clojure.core/assert-valid-fdecl/fn--7207 (core.clj:7187)

感谢。 艾坦

3 个答案:

答案 0 :(得分:3)

(defn get-c [{:keys [c]}] c) 

你添加了太多[]所以clojure试图破坏一个向量。

答案 1 :(得分:0)

(defn get-c [{c :c}] c)

这是Javadocs的一个很好的参考。

答案 2 :(得分:0)

在Clojure中破坏地图是一个非常方便和强大的功能。您可以破坏密钥,重命名密钥并为密钥提供默认值。

(defn destruct-test
  [{:keys [name company]
    :as zmap
    :or {name "Default Name"
         company "Default Company"}}]
  [name company])