当密钥存在时,Julia的字典方法`haskey`返回false

ant*_*ell 2 dictionary equality julia

我是Julia的新手,我不确定为什么最后一行评估为false:

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

D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.))  #False!
Run Code Online (Sandbox Code Playgroud)

显然关键存在,所以这里发生了什么!?

编辑.

如果我不使用类Point,它可以正常工作:

D = [(1.,2.) => 42]
haskey(D, (1., 2.))  #True!
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ern 6

但看看这个:

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

评估为true.

如果您使用相同的对象,它确实有效,但如果您使用具有相同字段值的2个对象,则它不起作用.请注意,使用的对象type是可变的,因此即使使用a Point作为键,您仍然可以在不知道字典的情况下更改其字段的值.字典需要对无法更改的内容进行哈希处理,例如类型对象的标识,而不是当前的字段值.由于元组是不可变的,因此它们的值可以安全地用作键.你也可以用

immutable Point{T}
 x::T
 y::T
end    
Run Code Online (Sandbox Code Playgroud)

  • 可以为您的类型定义`Base.isequal`,`Base.hash`等 (3认同)