2

Clojure でシンボルを新しいデータ構造に再バインドするにはどうすればよいですか。例えば:

 (def hash-map-one {:a "foo" :b "bar"})
 (def hash-map-two {:c "gaz" :d "waka"})

 ;; right here make hash-map-one equal to hash-map-two very quickly
 ;; if this were python I would say hash-map-one = hash-map-two

ちょっとした動機として、データ ファイルに依存する Web サービスがあり、そのデータ ファイルが更新され、その時点で、ダウンタイムなしで新しいデータに "切り替える" 必要があるため、これを行っています。

前もって感謝します!

4

1 に答える 1

5

ユースケースを考えると、アトムを使用するのが最も理にかなっています。

(def data (atom {:map 'of :initial "data"}))

(reset! data {:map 'of :new "data"})

何らかの理由で Var を使用したい場合は、 を使用alter-var-rootして新しい値に切り替えることができます。を使用することもできますが、その場合はの原子性保証internが失われます (ドキュメント文字列とこの回答を参照してください。コメント re:は にも同様に適用されます)。alter-var-rootdefintern

REPL では、def既存の Vars を再バインドするために使用することは完全に問題ありませんが、通常、プロダクション コードでは優れたアイデアではありません (Clojure 実装にはいくつかの注目すべき例外が見られますが、これは非常に特殊なケースです)。何よりも、defすぐに実行されるトップレベルのフォームでのみ使用する必要があります。つまり、それ自体がトップレベル フォームであるか、または のようなトップレベル フォームの本体の一部である必要がありますlet。そうしないと、奇妙なことが起こります

于 2013-05-31T03:24:27.393 に答える