在repl上骑过defonce var

时间:2016-06-12 18:03:52

标签: clojure

如何在repl上覆盖(重新定义)defonce var?

> (defonce moo "MOO")

> moo
>> "MOO"

> (defonce moo "CHANGED MOO")
> nil
> moo
>> "MOO"

感谢

2 个答案:

答案 0 :(得分:4)

正如您所演示的那样,defonce检查指定的var是否已经有一个值,如果有,则不管它。要更改现有的根绑定,您只需使用常规def

;; using def or defonce here makes no difference
(defonce moo "MOO")

moo
;=> "MOO"

(def moo "CHANGED MOO")

moo
;=> "CHANGED MOO"

答案 1 :(得分:1)

我不会将defonce' d var重新定义为def,因为它总是看起来像是一个错误..如果你是故意这样做的话(如果你真的需要它的话)某种原因),你可能想要强调它。就像使用alter-var-root

一样
user> (defonce a 10)
#'user/a

user> (alter-var-root #'a (constantly 20))
20