我知道在Clojure中,名称空间将符号映射到Vars。所以我们可以将符号x
映射到Var(这里是默认命名空间),如下所示:
user=> (def x 5)
#'user/x
user=> #'x
#'user/x
user=> (type #'x)
clojure.lang.Var
user=> x
5
现在,如果我后来说这个
user=> (def x 3)
#'user/x
我是否将符号x
反弹到一个全新的Var或者我是否更新了上面创建的同一个Var中的值?我怎么知道?
我认为它是后者,因为我读了句子"只有Java字段,Vars,Refs和Agent在Clojure中是可变的。"在Clojure Reference page on Vars,但我不确定是否作为证据。
答案 0 :(得分:3)
不,def
并不总是会创建新的Var
。您可以使用identical?
确认这一点:
user=> (def x 5)
#'user/x
user=> (def v #'x)
#'user/v
user=> (def x 3)
#'user/x
user=> (identical? v #'x)
true
答案 1 :(得分:3)
Elogent的答案非常好并且被接受,但我刚刚找到另一种方法来证明没有创建新的var,这可能是有用的:
user=> (def x 10)
#'user/x
user=> (let [y #'x] (println @y) (def x 7) (println @y))
10
7
nil
如果def
确实创建了一个新的var,我们会看到10次打印两次。