В Clojure я могу вызвать функцию, которая ожидает ключи с картой? - PullRequest
3 голосов
/ 19 октября 2011

Допустим, у меня есть

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

Я хочу вызвать test с картой {: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 ]

4 голосов
/ 19 октября 2011
user> (apply list (mapcat seq {:a 1 :b [2 3 4]}))
(:a 1 :b [2 3 4])
3 голосов
/ 19 октября 2011

Есть веская причина, чтобы не определять это в первую очередь?

(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
1 голос
/ 19 октября 2011

Это работает, но не элегантно:

(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]].

Лучшие решения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...