在 Clojure 中编写 get-and-set 函数是否有比以下更惯用/可读的方式:
(def the-ref (ref {}))
(defn get-and-set [new-value]
(dosync
(let [old-value @the-ref]
(do
(ref-set the-ref new-value)
old-value))))
在 Clojure 中编写 get-and-set 函数是否有比以下更惯用/可读的方式:
(def the-ref (ref {}))
(defn get-and-set [new-value]
(dosync
(let [old-value @the-ref]
(do
(ref-set the-ref new-value)
old-value))))
对于简单的情况,我倾向于直接使用此操作而不是包装在函数中:
hello.core> (dosync (some-work @the-ref) (ref-set the-ref 5))
5
在这种情况下dosync
,通常用作您正在寻找的包装器。这dosync
很重要,因为 dosync 可以很好地与其他事务组合并使事务的边界可见。如果您处于包装函数可以完全封装对 ref 的所有引用的位置,那么 refs 可能不是最好的工具。
refs 的典型用法可能看起来更像是这样的:
(dosync (some-work @the-ref @the-other-ref) (ref-set the-ref @the-other-ref))
很少需要包装它,因为当使用 ref 时,它们通常以多个 ref 为一组使用,因为手头的问题需要协调更改。在它们只是一个值的情况下,原子更常见。