通过查看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)有什么好处或原因?

最佳答案

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

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

10-06 10:00