gpt4 book ai didi

数组结构相等

转载 作者:行者123 更新时间:2023-12-03 18:33:54 25 4
gpt4 key购买 nike

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

最佳答案

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

这是因为 isequal实际上是在打电话 ==而不是 ==调用 isequal .在 isequal doc你可以明确地找到:

The default implementation of isequal calls ==, so a type that does not involve floating-point values generally only needs to define ==



因此正确的代码是:
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

关于数组结构相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62336686/

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