Clojure中def和defonce有什么区别?
何时使用def defon defonce,反之亦然?
当变量已经定义时,跳过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
如果名称没有根值,则Defonce仅将名称绑定到根值。
例如,就像Jay Fields blogs about一样,当你想重新加载命名空间时它可以结合使用,但你可能不需要重新加载所有命名空间。
(defonce ignored-namespaces (atom #{}))
(defn reload-all []
(doseq [n (remove (comp @ignored-namespaces ns-name) (all-ns))]
(require (ns-name n) :reload )))