gpt4 book ai didi

Clojure 中的映射和记录相等性

转载 作者:行者123 更新时间:2023-12-04 09:19:56 25 4
gpt4 key购买 nike

我发现 Clojure 的行为在映射和记录之间的相等性方面令人困惑。在第一个示例中,我们有两种结构相同的不同类型。等式 = 函数返回真:

user> (defn make-one-map
[]
{:a "a" :b "b"})
#'user/make-one-map
user> (def m1 (make-one-map))
#'user/m1
user> m1
{:a "a", :b "b"}
user> (def m2 {:a "a" :b "b"})
#'user/m2
user> m2
{:a "a", :b "b"}
user> (= m1 m2)
true
user> (type m1)
clojure.lang.PersistentArrayMap
user> (type m2)
clojure.lang.PersistentHashMap

在第二个示例中,我们有一个哈希映射和一个记录,它们在结构上是等效的,但 = 函数返回 false:
user> (defrecord Titi [a b])
user.Titi
user> (def titi (Titi. 1 2))
#'user/titi
user> titi
#user.Titi{:a 1, :b 2}
user> (= titi {:a 1 :b 2})
false

为什么会有差异?我正在使用 Clojure 1.3,我发现它们真的很困惑。

最佳答案

来自 defrecord 的文档字符串:

In addition, defrecord will define type-and-value-based =, and will defined Java .hashCode and .equals consistent with the contract for java.util.Map.



所以,当使用 = , 类型被考虑在内。您可以使用 .equals反而:
user> (.equals titi {:a 1 :b 2})
true

关于Clojure 中的映射和记录相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com