假设我有
(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时,我错过了这是可能的。然而,如果您遇到过由我或像我这样的人定义的函数,那么知道如何将地图传递给它仍然有用;)
答案 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负责此事。
更好的解决方案?