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阻止重新定义(即使用)标记为 var 的背后有什么好处或理由^:dynamic吗?

4

1 回答 1

4

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

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

于 2012-10-09T14:42:01.217 回答