Was ist der Unterschied zwischen def und defonce in Clojure?Was ist der Unterschied zwischen def und defonce in Clojure?
Wann verwenden Sie def über defonce oder umgekehrt?
Was ist der Unterschied zwischen def und defonce in Clojure?Was ist der Unterschied zwischen def und defonce in Clojure?
Wann verwenden Sie def über defonce oder umgekehrt?
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
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)))