2012-10-09 6 views
7

Mit Blick auf clojure.testsource code, entdeckte ich folgendes:Was nutzt ^: dynamic auf einem defonce?

(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) 

Gibt es einen Nutzen oder Grund Neudefinition verhindern (das heißt mit defonce) eines var, die als ^:dynamic gekennzeichnet ist?

+0

Könnte es sein, eine Warnung des Compilers über eine nicht dynamische Variable namens '* something *' zu verhindern? – thoferon

+0

Dann wäre die Frage, warum Ohrenschützer auf den Namen zu verwenden, die genau die gleiche Bedeutung von "^: Dynamic" in älteren Versionen von Clojure ausdrückt. Ich werde prüfen, ob frühere Versionen von 'clojure.test' verschiedene' def' Strategien für diese Var verwenden. – skuro

Antwort

4

defonce verhindert nicht die Neudefinition im Allgemeinen, aber nur wenn man die Datei neu lädt. Dies ist normalerweise nützlich, wenn die Variable eine Art von Status oder Kontext verwaltet. Ich glaube, dass die Verwendung von defonce hier ein Artefakt aus der Entwicklung der Bibliothek sein könnte, wo der Entwickler die Datei während der Entwicklung mehrmals neu laden muss, während er immer noch denselben Wert behalten möchte.

Da die Variable nicht auf einen Verweis verweist, sondern auf eine direkte Variable, ist die Verwendung von ^:dynamic die richtige Wahl. Jetzt kann der Code set! oder binding verwenden, um den Wert auf Thread-lokale Weise zu ändern.