如何在Clojure中让“def”不重新加载?

6

我在一个命名空间中有一项定义(def),我希望在应用程序启动时初始化它一次,但是每当包含这个“def”的命名空间被“使用”并从另一个命名空间重新加载时,该“def”就会被重新评估。如何防止在重新加载期间重新评估“def”?

2个回答

14

defonce可以部分满足你的需求,如果命名空间是:reloaded,它仍然会被重新定义,因为在(use 'my.namespace :reload)中,旧的根绑定会被抛弃。

defonce是一个宏,它会检查给定命名空间中变量是否已经有了根绑定,如果没有,则定义它。通过将这个特殊的def放入自己的命名空间中,并使用(in-ns ...)来保护它不被重新加载删除,你可以使用它来解决你的问题。然后,你就可以随意多次重载'main'命名空间,代码应该只会被定义一次。


嘿,自从这个答案发布以来这种行为改变了吗?我尝试在一个命名空间中添加(defonce x 5),启动REPL,x的值是5,然后我在源代码中将其更改,尝试(require :reload 'test) 和 (use :reload 'test),但x仍然是5。 - Hendekagon


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接