与数组的结构相等

问题描述 投票:2回答:2

如果下面的结构中有数组,由于数组是可变的,我无法比较结构的相等性?有没有办法让相等性传递到数组,以便我得到truea([1,2,3]) == a([1,2,3])?还是执行此操作以扩展Base.==的唯一方法?

julia> struct a
       v
       end

julia> a([1,2,3]) == a([1,2,3])
false

julia> a(1) == a(1)
true

julia> [1,2,3] == [1,2,3] # want the equality to work like this for the struct
true

julia> [1,2,3] === [1,2,3]
false
struct julia equals mutable
2个回答
3
投票

@ miguel raz的回答根本不起作用!

之所以会这样,是因为isequal实际上是在调用==,而不是==在调用isequal。在isequal文档中,您可以明确找到:

isequal的默认实现会调用==,因此不涉及的类型 浮点值通常只需要定义==

因此正确的代码是:

struct A
  v
end
import Base.==
==(x::A,y::A) = x.v==y.v

但是,更优雅的方法是编写不依赖于字段v的通用代码。由于我们不想重载默认的==运算符,因此我们可以定义一个abstract类型,该类型将告诉Julia使用我们的实现:

abstract type Comparable end

import Base.==

function ==(a::T, b::T) where T <: Comparable
    f = fieldnames(T)
    getfield.(Ref(a),f) == getfield.(Ref(b),f)
end

现在您可以定义自己的结构以进行正确比较:

struct B <: Comparable
    x
    y
end

测试:

julia> b1 = B([1,2],[B(7,[1])]);

julia> b2 = B([1,2],[B(7,[1])])

julia> b1 == b2
true

0
投票

编辑:此代码是错误的。我正在删除它,以免混淆其他用户。请阅读所选答案。自我注意-重新启动REPL并重新运行代码以确保一切正常。感谢@Przemyslaw指出这一点。

© www.soinside.com 2019 - 2024. All rights reserved.