Function 制作一个将其参数作为:键传递给另一个函数的函数
我有一个函数,它的形式如下Function 制作一个将其参数作为:键传递给另一个函数的函数,function,clojure,hashmap,Function,Clojure,Hashmap,我有一个函数,它的形式如下 (defn foo [& {:keys [x y z]}] ...) 我想创建一个函数,它只接受键y和z,但总是给x相同的值。我可以这样写 (defn bar [& {:keys [y z]}] (foo :x "blah" :y y :z z)) 我唯一的问题是我必须再次重复{:keys…}位,而实际的函数foo有更多的键,这在将来可能会改变。有什么方法可以让bar接受任何键值对,并将它们全部传递给foo,同时确保x保持不变吗?这可以工作
(defn foo [& {:keys [x y z]}]
...)
我想创建一个函数,它只接受键y和z,但总是给x相同的值。我可以这样写
(defn bar [& {:keys [y z]}]
(foo :x "blah" :y y :z z))
我唯一的问题是我必须再次重复{:keys…}位,而实际的函数foo有更多的键,这在将来可能会改变。有什么方法可以让bar接受任何键值对,并将它们全部传递给foo,同时确保x保持不变吗?这可以工作并覆盖传递给
bar的任何:x
值:
(defn foo [& {:keys [ x y ]}]
[x y])
(defn bar [ & args ]
(apply foo (concat args [:x "blah"])))
当您使用与(&)符号时,您是在声明一个可变函数。
你可能不需要你的函数是可变的。
您可以简单地执行以下操作:
(defn foo [{:keys [x y z]}]
[x y z])
(defn bar [{:keys [y z] :as args}]
(foo (assoc args :x "blah")))
您将使用如下映射调用bar
:(bar{:y20:z10})
。如果您确实需要bar
作为可变函数,您可以这样做(foo
与上面的相同):
您将继续这样调用bar
:(bar:y10:z20)
。您也可以使foo
可变,但您必须使用类似(展平(映射列表(键参数)(VAL参数)))
的东西重新创建参数列表。您的函数需要可变吗?或者你只是想传递一张地图?它必须是可变的,我不想传递地图。不,我绝对需要它是可变的。实际的foo函数只是将值放入一个记录中,当函数运行时,其中一些值可能是nil
。如果bar的参数已经包含:x值,这将是一个问题。这正是我所要求的。谢谢:)@mobyte当:x被赋予bar时,如果它只是抛出一个错误,实际上会更好,因为bar应该只需要一个:x值。
(defn bar [& {:keys [y z] :as args}]
(foo (assoc args :x "blah"))
(defn bar [& {:keys [y z] :as args}]
(apply foo (apply concat (assoc args :x "blah"))))