在Clojure中,有没有一种更符合惯用法/易读的写法来编写获取和设置函数呢?
(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中,有没有一种更符合惯用法/易读的写法来编写获取和设置函数呢?
(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可能不是最好的工具。(dosync (some-work @the-ref @the-other-ref) (ref-set the-ref @the-other-ref))
需要包装它的情况很少,因为当引用被使用时,它们通常是以多个引用组的形式使用的,因为问题需要协调更改。在只有一个值的情况下,原子更为常见。