Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中,我可以调用一个需要带有映射的键的函数吗?_Clojure - Fatal编程技术网

在Clojure中,我可以调用一个需要带有映射的键的函数吗?

在Clojure中,我可以调用一个需要带有映射的键的函数吗?,clojure,Clojure,假设我有 (defn test [ & {:keys [a b c]}] (println a) (println b) (println c)) 我想用映射调用test{:a1:b2:c3} 这项工作: (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

假设我有

(defn test [ & {:keys [a b c]}]
   (println a)
   (println b)
   (println c))
我想用映射调用test
{:a1:b2:c3}

这项工作:

(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时,我错过了这一点。然而,如果您遇到由我或像我这样的人定义的函数,那么知道如何向其传递映射仍然很有用;)

这是可行的,但不雅观:

(应用测试(展平(seq{:a1:b2:c3}))

(apply test(seq{:a1:b2:c3}))
不起作用的原因是
(seq{:a1:b2:c3})
返回
[:a1][:b2][:c3]
,Flatte会处理这个问题


更好的解决方案?

有什么好的理由不这样定义吗

user> (apply list (mapcat seq {:a 1 :b [2 3 4]}))
(:a 1 :b [2 3 4])
(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

值得一提的是,您正在尝试进行一些奇特的解构。此外,我还不清楚您打算如何在这里使用可变(&)参数。如果您没有可变参数,则使用映射调用test将按照您的意愿工作。同意最好的选择是如果您可以帮助的话,不要做“关键字参数”的事情。在某些不寻常的情况下,这是很好的,但从一层传递到另一层却很尴尬。将一系列键值转换为一个映射很容易,但正如您所看到的,将一系列键值转换为一系列键值并不是那么简单。这表明展开参数比需要映射(如果它们是可选的)要好。@JulienChastang oops,我一直认为&必须使用:键。谢谢你澄清了这个误解。@amalloy你认为关键字总体上是邪恶的还是仅仅是我的&{:keys…}版本?任何不涉及
flatte
的东西都比这个好。如果我的地图是
{:a[1 2 3]:b[4 5 6]}
,怎么办?起初我不知道你可以省略
&
。但是,如果你在野外遇到了一个你没有编写的函数,那么了解上述问题的解决方案仍然是有用的。