^:动态对defonce有什么用?

时间:2012-10-09 10:07:50

标签: clojure environment-variables

查看clojure.test source code,我发现了以下内容:

(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)var标记为^:dynamic

1 个答案:

答案 0 :(得分:4)

defonce一般不会阻止重新定义,但仅限于重新加载文件时。当var维护某种状态或上下文时,这通常很有用。我相信这里defonce的用法可能是库开发中的一个工件,开发人员需要在开发期间多次重新加载文件,同时仍希望保留相同的值。

由于var没有指向ref,而是直接var,因此使用^:dynamic是正确的选择。现在,代码可以使用set!binding以线程本地方式更改值。