В чем разница между def и defonce in Clojure?В чем разница между def и defonce в Clojure?
Когда следует использовать def over defonce или наоборот?
В чем разница между def и defonce in Clojure?В чем разница между def и defonce в Clojure?
Когда следует использовать def over 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, его можно использовать в сочетании, если вы хотите перезагрузить пространства имен, но вам может не понадобиться перезагрузить все.
(defonce ignored-namespaces (atom #{}))
(defn reload-all []
(doseq [n (remove (comp @ignored-namespaces ns-name) (all-ns))]
(require (ns-name n) :reload)))