数组结构相等

Ale*_*lec 7 struct equals mutable julia

如果我在如下结构中有数组,我无法比较结构的相等性,因为数组是可变的?有没有办法让等式传递给数组,以便我得到truefor 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
Run Code Online (Sandbox Code Playgroud)

Prz*_*fel 7

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

发生这种情况isequal是因为实际上是在调用==而不是==调用isequal. 在isequal文档中,您可以明确地找到:

isequalcall的默认实现==,所以一个不涉及浮点值的类型一般只需要定义==

因此正确的代码是:

struct A
  v
end
import Base.==
==(x::A,y::A) = x.v==y.v
Run Code Online (Sandbox Code Playgroud)

但是,更优雅的方法是编写不依赖于具有字段的通用代码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
Run Code Online (Sandbox Code Playgroud)

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

struct B <: Comparable
    x
    y
end
Run Code Online (Sandbox Code Playgroud)

测试:

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

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

julia> b1 == b2
true
Run Code Online (Sandbox Code Playgroud)