如果下面的结构中有数组,由于数组是可变的,我无法比较结构的相等性?有没有办法让相等性传递到数组,以便我得到true
为a([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
@ 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
编辑:此代码是错误的。我正在删除它,以免混淆其他用户。请阅读所选答案。自我注意-重新启动REPL并重新运行代码以确保一切正常。感谢@Przemyslaw指出这一点。