Clojure中def和defonce有什么区别?

时间:2016-05-20 12:39:43

标签: clojure functional-programming lisp clojurescript

Clojure中 def defonce 有什么区别?

何时使用 def 而不是 defonce ,反之亦然?

2 个答案:

答案 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 )))