2016-05-20 13 views

Antwort

12

defonce wird übersprungen, wenn die Variable bereits definiert ist.

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 
4

Defonce bindet nur wenn der Name auf den Root-Wert, wenn der Name keinen Root-Wert hat.

Zum Beispiel, wie Jay Fields blogs über, kann es in Verbindung verwendet werden, wenn Sie Namespaces neu laden möchten, aber Sie müssen möglicherweise nicht alle neu laden.

(defonce ignored-namespaces (atom #{})) 

(defn reload-all [] 
    (doseq [n (remove (comp @ignored-namespaces ns-name) (all-ns))] 
    (require (ns-name n) :reload)))