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いるラッパーとして機能します。dosyncdosyncは他のトランザクションとうまく構成され、トランザクションの境界を表示するため、これは重要です。ラッパー関数がrefへのすべての参照を完全にカプセル化できる位置にいる場合は、おそらくrefは最適なツールではありません。

refの一般的な使用法は、次のようになります。

(dosync (some-work @the-ref @the-other-ref) (ref-set the-ref @the-other-ref))

refを使用する場合、目前の問題では調整された変更が必要になるため、通常は複数のrefのグループで使用されるため、ラップする必要はほとんどありません。それらが1つの値にすぎない場合は、アトムがより一般的です。

于 2012-05-22T21:55:55.673 に答える