这个问题是我练习的时候产生的教程中的观察者主题 http://mishadoff.com/blog/clojure-design-patterns/#episode-10-observer我试图将该功能应用于用户,但无法使用用户的数据字段,例如姓名。
假设用户可能有不同数量的数据字段,因此我们必须使用& args
争论。我的代码不起作用:
(ns observer.core)
(def user {:name "Alan" :surname "Smith" :alias "Mike"})
(def user2 {:name "Jane" :surname "Smith"})
(apply
(fn [& args] (println (str "I am " (:name args) " " (:surname args) ".")))
user)
(apply
(fn [& args] (println (str "My sister is " (:name args) " " (:surname args) ".")))
user2)
输出:
I am .
My sister is .
observer.core>
如何解决这个问题apply
必须使用函数吗?
apply
将映射转换为 seq,即{:name "Alan" :surname "Smith" :alias "Mike"}
变成([:name "Alan"] [:surname "Smith"] [:alias "Mike"])
如果您需要的话,您可以将其放回地图中:
(let [user {:name "Alan" :surname "Smith" :alias "Mike"}]
(apply
(fn [& args]
(let [args (into {} args)]
(println (str "I am " (:name args) " " (:surname args) "."))))
user))
但这对我来说看起来有点牵强。我相信如果我知道如何使用这个函数,解决方案可能会更好。
通常有两种类型的函数:(fn :text "some" :row 25)
and (fn {:text "some" :row 25})
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)