Dictionary 朱莉娅';的字典方法“haskey”在存在键时返回false

Dictionary 朱莉娅';的字典方法“haskey”在存在键时返回false,dictionary,equality,julia,Dictionary,Equality,Julia,我是Julia的新手,我不知道为什么最后一行的计算结果为false: type Point{T} x::T y::T end D = [Point(1.,2.) => 42] haskey(D, Point(1., 2.)) #False! 很明显,钥匙是存在的,这是怎么回事 编辑。 如果我不使用类点,它可以正常工作: D = [(1.,2.) => 42] haskey(D, (1., 2.)) #True! 我们不能将类用于字典键类型吗 但是看看这个: type

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

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

D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.))  #False!
很明显,钥匙是存在的,这是怎么回事

编辑。

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

D = [(1.,2.) => 42]
haskey(D, (1., 2.))  #True!
我们不能将类用于字典键类型吗

但是看看这个:

type Point{T}
  x::T
  y::T
end
P = Point(1., 2.)
D = [P => 42]
haskey(D, P)
计算结果为
true

如果使用同一个对象,它会起作用,但是如果使用两个具有相同字段值的对象,它就不起作用。请注意,使用
type
定义的对象是可变的,因此即使使用
作为键,也可以在字典不知道的情况下更改其字段的值。字典需要对无法更改的内容进行散列,例如类型对象的标识,而不是当前的字段值。由于元组是不可变的,所以它们的值可以安全地用作键。你也可以使用

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

如果您为
定义了一个自定义的
散列
方法,那么一切都会按照您的预期进行。

谢谢!看起来我要找的是不可变的。。您不能定义类之间的比较方式,比如java/C的
bool override Equals(Object otherObject)
Base.isequal
Base.hash
,等等。可以为您的类型定义