2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多有关如何使用本网站的信息。

0
ClojureScript

错误报告

(defn f [] 1)
=> #'cljs.user/f
(= f (with-meta f {:a 1}))
=> false ;; should be true

关于: https://clojure.org/reference/metadata
"元数据不会影响等价性"

2 答案

+1

被选中
 
最佳答案

页面也说明“只有元数据不同的两个对象是相等的”和“具有不同元数据的对象是不同的对象”。

因此,当它依赖于对象身份时,等价性确实受到影响。例如对于编译函数:(not= (fn []) (fn []))不管元数据如何。

可能需要澄清。

人们询问这个问题是在寻找某种好处,比如“元数据不会影响等价性(除非在一些等价性是对象身份的情况下,例如比较 Clojure 函数)”吗?
确实,这可能是在Clojure中内置的唯一一个具有元数据和按身份比较的类的示例。我浏览了GitHub仓库(点击查看引用的方式真的很棒!)但没有找到另一个。当然,当你考虑Clojure未内置的类时,天空才是极限。

需要明确的关键点是,当这些对象按身份比较,例如函数时,规则“元数据不影响相等性”被另一条规则“更改元数据会产生新的对象”所取代。
在Clojure中,可以拥有元数据的事物种类并不多,而且在Clojure外部添加的只有额外的持久集合实现,其中大多数或所有都是通过值比较而非身份比较进行等性比较。我同意第三方库中可能存在无限的可能,但我怀疑你能找到多少符合这种异常的例子。
+1

我认为这并不是一个错误。它的行为与JVM Clojure相同。

函数没有值语义,所以它们的= 实现依赖于对象引用比较。

当你向函数添加元数据时,它会变成一个不同的函数对象,因此 = 返回 false。

...