Clojure:列表是否可以与向量相同?

8
在 REPL 中,当您输入
(= [1 2 3] (list 1 2 3))

你会得到一个true。这是不是意味着列表可以与向量相同?

它们的内容是相同的。但它们的类型不同,内部在内存中的表示方式、访问方法等也是如此。 - nooga
1
关于编程的内容:Clojure等式集合与序列 - sloth
1个回答

5
不,一个 `clojure.lang.PersistentList` 永远不可能与一个 `clojure.lang.IPersistentVector` 相同 - 它们是不同的类型,显然不同类型的对象不能是同一个对象。因此它们不能相同。
但是,它们可以相等。Clojure 中的 `=` 检查相等性而不是身份识别,并调用每个 Java `Object` 都具有的 `equals` 方法。列表和向量都实现了 `equals`,通过确定列表/向量的内容是否与其他集合的内容 `equal`(如果另一个对象不是一个集合,则会返回 `false`)。

3
大体上讲是正确的,但 = 在处理集合时不会调用 Java 的 equals 方法,因为 Java 的 equals 方法需要满足 Clojure 不喜欢的契约要求。相反,它会调用 Clojure 特有的方法 pcequiv,代表"持久化集合等价性(persistent collection equivalent)"。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接