2011-10-08 65 views
33

將整數用作Ruby散列中的鍵是否合適?使用整數作爲散列鍵

文檔中的每個示例都顯示一個字符串或符號被用作鍵,但從不是整數。

在內部,將整數以某種方式轉換爲字符串?我看到了有關這個問題的一些矛盾的信息。

換句話說,使用整數鍵來散列有什麼重大的缺點?

+2

你試過了嗎?在你的控制檯上,你可以輸入IRB並獲得一個ruby控制檯..對於嘗試這種類型的東西非常有用......在主題上,你應該能夠使用整數就好。 – Deleteman

+1

[「除了索引是通過任意對象類型的任意鍵完成的」](http://www.ruby-doc.org/core/Hash.html)。整數是Ruby中的對象,Hashes也是如此,所以你可以使用Hashes作爲鍵。 –

回答

42

當然你可以使用整數作爲鍵...

h = {1 => 'one', 2 => 'two', 3 => 'three'} 

(1..3).each do |i| 
    puts h[i] 
end 

=>

one 
two 
there 

IRB是你的朋友!試試吧..


事實上,你可以使用任何Ruby對象的鍵(或價值)。 我們通常不會考慮像這樣使用Hashes,但它可能非常有用。

+0

有一件事我發現有關數字鍵的哈希文字有趣的是你不能使用語法{1:'one',2:'two'}。我猜這個語法假定每個鍵都是一個符號,而整數不是。 – BlueMonkMN

+0

是的,x:只適用於符號 – Tilo

9

使用對象作爲散列鍵的唯一要求是它必須以散列值響應消息散列,並且給定鍵的散列值不得更改。舉例來說,如果你把這個:

1.hash() 

你可以看到,1號確實響應散列消息

+0

我認爲它曾經是1.8。但我不確定它在1.9中仍然如此。我的意思是,在1.9中你可以免費得到一個散列。 – Candide

+0

對,我不是故意說你必須明確地調用你想用作鍵的對象的hash() - 重要的是對象實現了hash()方法(或者'響應哈希消息',用OO的說法) –

+5

它也必須響應'eql?'。 –

3

目前已經回答了關於is it possible?

解釋,爲什麼沒有整數作爲哈希鍵的例子。

散列鍵具有(大多數情況下)的含義。它可能是屬性名稱及其值(例如:color => 'red' ...)。

當你有一個整數作爲一個鍵,你的語義可能是'第一,第二...'(1)。但是,你不使用散列,而是一個數組來存儲你的值。

(1)反例可能是數據庫中的外鍵。

26

其他望着這裏的答案會覺得很有趣知道發生異常,當你在一個Ruby hash{symbol: value}

hash = {1: 'one'} # will not work 
hash = {1 => 'one'} # will work 

要求的解釋使用整數作爲符號鍵:

最簡單的答案爲什麼第一個例子失敗的原因可能是to_sym不是針對Fixnum整數實施的方法。

爲了更深入地解釋這是爲什麼,使用符號的一個主要好處是兩個符號實際上是「同一個對象」。或者至少他們共享相同的對象ID。

:foo.object_id == :foo.object_id 
=> true 

相同的字符串不共享相同的對象,因此不共享相同的對象ID。

"foo".object_id == "foo".object_id 
=> false 

像符號一樣,相同的Fixnum整數將具有相同的對象ID。因此你並不需要將它們轉換成符號。

one = 1 
=> 1 
uno = 1 
=> 1 
one.object_id 
=> 3 
one.object_id == uno.object_id 
=> true