Clojure中def和defonce有什么区别?

问题描述 投票:12回答:2

Clojure中def和defonce有什么区别?

何时使用def defon defonce,反之亦然?

clojure functional-programming lisp clojurescript
2个回答
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

6
投票

如果名称没有根值,则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 )))
© www.soinside.com 2019 - 2024. All rights reserved.