我在一个命名空间中有一项定义(def),我希望在应用程序启动时初始化它一次,但是每当包含这个“def”的命名空间被“使用”并从另一个命名空间重新加载时,该“def”就会被重新评估。如何防止在重新加载期间重新评估“def”?
我在一个命名空间中有一项定义(def),我希望在应用程序启动时初始化它一次,但是每当包含这个“def”的命名空间被“使用”并从另一个命名空间重新加载时,该“def”就会被重新评估。如何防止在重新加载期间重新评估“def”?
defonce
可以部分满足你的需求,如果命名空间是:reloaded,它仍然会被重新定义,因为在(use 'my.namespace :reload)
中,旧的根绑定会被抛弃。
defonce
是一个宏,它会检查给定命名空间中变量是否已经有了根绑定,如果没有,则定义它。通过将这个特殊的def放入自己的命名空间中,并使用(in-ns ...)
来保护它不被重新加载删除,你可以使用它来解决你的问题。然后,你就可以随意多次重载'main'命名空间,代码应该只会被定义一次。