7

clojure.test ソースコードを見て、私は次のことを発見しました:

(defonce ^:dynamic
  ^{:doc "True by default.  If set to false, no test functions will
   be created by deftest, set-test, or with-test.  Use this to omit
   tests when compiling or loading production code."
    :added "1.1"}
  *load-tests* true)

defonceとしてマークされている変数の再定義を防ぐ(つまり、を使用する)ことの背後にある利点または理由はあります^:dynamicか?

4

1 に答える 1

4

defonce一般に再定義を妨げることはありませんが、ファイルをリロードする場合に限ります。これは通常、変数が何らかの状態またはコンテキストを維持している場合に役立ちます。ここでの使用法はdefonce、ライブラリの開発によるアーティファクトである可能性があると思います。開発者は、同じ値を保持したいのに、開発中にファイルを何度もリロードする必要があります。

varはrefを指しているのではなく、直接varを指しているので、を使用する^:dynamicのが正しい選択です。これで、コードはスレッドローカルな方法でset!またはを使用して値を変更できます。binding

于 2012-10-09T14:42:01.217 に答える