请分享您的观点,参加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 函数)”?
by
的确,这可能是在Clojure中内建的唯一一个带有元数据和根据身份比较的类的示例。我在GitHub仓库周围逛了一圈(你可以点击查看引用,这真是个奇妙的功能!)但没有找到其他(例子)。当然,当你考虑Clojure未内置的类时,天空才是极限。

需要明确的是,当这些对象在身份上进行比较时(例如函数),"元数据不影响等价性"这条规则被"改变元数据将产生一个新对象"的规则所取代。
by
可具有元数据的事物种类并不多,在Clojure中也没有多少。我所知道的唯一在Clojure之外添加的,就是持久集合的额外实现。其中大部分或全部都是通过值,而不是身份来进行等价比较。我同意第三方库中可能存在无限可能,但我怀疑你无法找到很多这个例外中的例子。
+1
by

我认为这不是一个bug。它的表现与JVM Clojure相同。

函数没有值语义,因此它们的“=”实现退回到对象引用比较。

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

...