【问题标题】:Does the Clojure special form `def` always create a new Var?Clojure 特殊形式 `def` 是否总是创建一个新的 Var?
【发布时间】:2016-07-31 21:28:22
【问题描述】:

我知道在 Clojure 中,命名空间将符号映射到 Var。所以我们可以像这样将符号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 和 Agents 在 Clojure 中是可变的”这句话。在Clojure Reference page on Vars 中,但我不确定这是否可以作为证明。

【问题讨论】:

标签: clojure


【解决方案1】:

不,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

【讨论】:

    【解决方案2】:

    Elogent 的回答非常好并被接受,但我刚刚找到了另一种方法来证明没有创建新的 var,这可能有用:

    user=> (def x 10)
    #'user/x
    user=> (let [y #'x] (println @y) (def x 7) (println @y))
    10
    7
    nil
    

    如果def 确实创建了一个新变量,我们会看到 10 打印了两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 2015-09-06
      • 2016-06-09
      • 1970-01-01
      • 2015-11-22
      • 2019-11-18
      • 2013-03-29
      • 2011-01-15
      相关资源
      最近更新 更多