2015-06-02 20 views
2

我是新來朱莉婭,我不知道爲什麼最後一行的計算結果爲假:Julia的字典法`haskey`返回false時,關鍵是目前

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

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

顯然鍵存在有啥怎麼回事呢? ?

編輯。

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

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

難道我們不能用類字典的密鑰類型?

回答

6

但是看看這個:

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  
+0

謝謝!它看起來像不可變的是我正在尋找..你不能定義類如何比較像java/C#的'布爾覆蓋Equals(Object otherObject)'? – anthonybell

+3

可以爲您的類型定義'Base.isequal','Base.hash'等 – IainDunning

3

如果你定義Point定製hash方法,那麼事情會如您所願。