Julia 的字典方法 `haskey` 在存在键时返回 false

Julia's dictionary method `haskey` returning false when key is present

我是 Julia 的新手,我不确定为什么最后一行的计算结果为 false:

type Point{T}
  x::T
  y::T
end

D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.))  #False!

显然密钥存在,所以这是怎么回事!?

编辑。

如果我不使用 class Point,它工作正常:

D = [(1.,2.) => 42]
haskey(D, (1., 2.))  #True!

我们可以不对字典键类型使用 classes 吗?

但是看看这个:

type Point{T}
  x::T
  y::T
end
P = Point(1., 2.)
D = [P => 42]
haskey(D, P)

计算为 true

如果您使用相同的对象,它确实有效,但如果您使用具有相同字段值的 2 个对象,则它无效。请注意,使用 type 定义的对象是可变的,因此即使在您使用 Point 作为键之后,您仍然可以在字典不知道的情况下更改其字段的值。字典需要散列一些不能改变的东西,比如类型对象的标识,而不是当前的字段值。由于元组是不可变的,它们的值可以安全地用作键。你也可以使用

immutable Point{T}
 x::T
 y::T
end    

如果您为 Point 定义一个自定义 hash 方法,那么一切都会如您所愿。