2012-10-09 10 views
7

Patrząc na clojure.testsource code, dostrzegłem następujące:Jaki jest pożytek z ^: dynamic na 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) 

Czy jest jakaś korzyść lub powodem zapobiegania redefinicji (czyli używając defonce) o var oznaczonego jako ^:dynamic?

+0

Czy możliwe jest zapobieganie ostrzeżeniu kompilatora o posiadaniu nie dynamicznego var o nazwie '* something *'? – thoferon

+0

Następnie pojawi się pytanie, dlaczego używać nauszników na nazwie, która wyraża dokładnie to samo znaczenie '^: dynamic' w starszych wersjach Clojure. Sprawdzę, czy poprzednie wersje 'clojure.test' używają różnych strategii' def' dla tego var. – skuro

Odpowiedz

4

defonce nie wyklucza redefinicji w ogóle, ale tylko wtedy, gdy ponownie załaduje plik. Jest to przydatne zwykle, gdy var utrzymuje jakiś stan lub kontekst. Sądzę, że użycie tutaj defonce może być artefaktem wynikającym z rozwoju biblioteki, w której programista musi ponownie załadować plik wiele razy podczas programowania, a jednocześnie chciał zachować tę samą wartość.

Ponieważ var nie wskazuje ref, ale jest bezpośrednim var, użycie ^:dynamic jest właściwym wyborem. Teraz kod może użyć wartości set! lub binding, aby zmienić wartość w sposób lokalny dla wątku.

Powiązane problemy