Clojure中 def 和 defonce 有什么区别?
何时使用 def 而不是 defonce ,反之亦然?
答案 0 :(得分:19)
defonce
在已定义变量时被跳过。
user> (def a 1) ;;=> #'user/a
user> a ;;=> 1
user> (def a 2) ;;=> #'user/a
user> a ;;=> 2
user> (defonce b 1) ;;=> #'user/b
user> b ;;=> 1
user> (defonce b 2) ;;=> nil
user> b ;;=> 1
答案 1 :(得分:6)
如果名称没有根值,则Defonce仅将名称绑定到根值。
例如,就像Jay Fields blogs一样,当你想重新加载命名空间时它可以结合使用,但你可能不需要重新加载所有命名空间。
(defonce ignored-namespaces (atom #{}))
(defn reload-all []
(doseq [n (remove (comp @ignored-namespaces ns-name) (all-ns))]
(require (ns-name n) :reload )))