请在 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

我认为这不算是一个错误。它的行为和JVM的Clojure一样。

函数没有值语义,所以它们的实现`=`是回退到对象引用比较。

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

...