在Clojure中,我可以调用一个期望带有地图的键的函数吗?

时间:2011-10-18 22:06:55

标签: clojure

假设我有

(defn test [ & {:keys [a b c]}]
   (println a)
   (println b)
   (println c))

我想要的是使用地图 {:a 1 :b 2 :c 3}调用测试。

这有效:

(apply test [:a 1 :b 2 :c 3])

这些不是:

(apply test {:a 1 :b 2 :c 3})
(apply test (seq {:a 1 :b 2 :c 3}))

修改 所以你当然可以定义这样的函数:

(defn test [{:keys [a b c]}] ; No & 
  (println a)
  (println b)
  (println c))

然后你可以将地图传递给它:

(test {:a 1 :b 2 :c 3})
1
2
3

在学习clojure时,我错过了这是可能的。然而,如果您遇到过由我或像我这样的人定义的函数,那么知道如何将地图传递给它仍然有用;)

3 个答案:

答案 0 :(得分:4)

user> (apply list (mapcat seq {:a 1 :b [2 3 4]}))
(:a 1 :b [2 3 4])

答案 1 :(得分:3)

有什么理由不首先将它定义为这样吗?

(defn my-test [{:keys [a b c]}] ;; so without the &
   (println a)
   (println b)
   (println c))

然后这样称呼它?

(my-test {:a 10 :b 20 :c 30})

输出:

10
20
30
nil

答案 2 :(得分:1)

这很有效,但不太优雅:

(apply test (flatten (seq {:a 1 :b 2 :c 3})))

(apply test (seq {:a 1 :b 2 :c 3}))不起作用的原因是(seq {:a 1 :b 2 :c 3})返回[[:a 1] [:b 2] [:c 3]],flatten负责此事。

更好的解决方案?