3

次の形式をとる関数があります

(defn foo [& {:keys [x y z]}]
  ...)

そして、キー y と z のみを受け取り、常に x に同じ値を与える関数を作成したいと考えています。このように書くことができました

(defn bar [& {:keys [y z]}]
  (foo :x "blah" :y y :z z))

私の唯一の問題は、 {:keys ...} ビットをもう一度繰り返さなければならず、実際の関数 foo にはさらに多くのキーがあり、将来変更される可能性があることです。xが同じままであることを確認しながら、barにキーと値のペアを受け入れさせ、それらをすべてfooに渡す方法はありますか?

4

3 に答える 3

2

これは機能し、:x渡された値をオーバーライドしますbar:

(defn foo [& {:keys [ x y ]}]
   [x y])

(defn bar [ & args ]
   (apply foo (concat args [:x "blah"])))
于 2013-05-22T23:22:53.817 に答える
1

アンパサンド (&) を使用すると、可変個引数関数が宣言されます。おそらく、関数を可変長にする必要はありません。これを簡単に行うことができます:

(defn foo [{:keys [x y z]}]
  [x y z])

(defn bar [{:keys [y z] :as args}]  
  (foo (assoc args :x "blah")))

そして、次barのようなマップで呼び出します: (bar {:y 20 :z 10}). 本当にbar可変関数である必要がある場合は、これを行うことができます(foo上記と同じです):

(defn bar [& {:keys [y z] :as args}]
   (foo (assoc args :x "blah"))

そして、あなたはそのように呼び出し続けますbar: (bar :y 10 :z 20). 可変個引数にすることもできfooますが、引数リストを のようなもので自分で再作成する必要があります(flatten (map list (keys args) (vals args))))

于 2013-05-22T23:38:39.593 に答える