【发布时间】:2016-12-05 20:32:54
【问题描述】:
我有一个带有向量值的原子:
(def v (atom [1 2]))
我想编写一个函数来返回这个取消引用的原子。也就是说,我基本上是想写一个函数,它会返回和这个一样的结果:
=> @v
[1 2]
我的第一个想法是这样的:
=> (let [f #(@v)]
(println (f)))
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:429)
但这当然不起作用,因为取消引用的原子不是函数:
=> (@v)
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:429)
我最终得到的解决方法是:
=> (let [f #(vec @v)]
(println (f)))
[1 2]
nil
...但肯定有更好的方法来做到这一点,而不必假设 atom 的值是向量?
【问题讨论】:
-
(defn deref-v [] (deref v)) -
这只是
deref函数。我不知道为什么人们将它作为 asnwer 包装在一个函数中,但无论如何,你在 cmets 中提到这是一个简化的问题。我认为你简化了太多,所以也许编辑并给我们更多细节?正如您目前所提出的问题,deref是 的功能。如果你只使用deref,你根本不会污染你的命名空间,你也可以使用@阅读器宏快速deref。 -
不仅仅是
deref函数!它并没有取消它的论点,而是v。 FWIW,你也可以写:#(-> @v) -
@MasterMastic 不,这是不正确的。正如 ClojureMostly 所说,
deref不等同于(fn [] (deref v))。 -
哦,我明白了,我认为它比这更笼统(尽管您在 cmets 中也提到您希望能够将不同的原子传递给它?),但我仍然认为您应该更具体。
标签: function clojure functional-programming