如何在repl上覆盖(重新定义)defonce var?
> (defonce moo "MOO")
> moo
>> "MOO"
> (defonce moo "CHANGED MOO")
> nil
> moo
>> "MOO"
感谢
答案 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