3

在 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))))
4

1 回答 1

2

对于简单的情况,我倾向于直接使用此操作而不是包装在函数中:

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 为一组使用,因为手头的问题需要协调更改。在它们只是一个值的情况下,原子更常见。

于 2012-05-22T21:55:55.673 回答