將整數用作Ruby散列中的鍵是否合適?使用整數作爲散列鍵
文檔中的每個示例都顯示一個字符串或符號被用作鍵,但從不是整數。
在內部,將整數以某種方式轉換爲字符串?我看到了有關這個問題的一些矛盾的信息。
換句話說,使用整數鍵來散列有什麼重大的缺點?
將整數用作Ruby散列中的鍵是否合適?使用整數作爲散列鍵
文檔中的每個示例都顯示一個字符串或符號被用作鍵,但從不是整數。
在內部,將整數以某種方式轉換爲字符串?我看到了有關這個問題的一些矛盾的信息。
換句話說,使用整數鍵來散列有什麼重大的缺點?
當然你可以使用整數作爲鍵...
h = {1 => 'one', 2 => 'two', 3 => 'three'}
(1..3).each do |i|
puts h[i]
end
=>
one
two
there
IRB是你的朋友!試試吧..
事實上,你可以使用任何Ruby對象的鍵(或價值)。 我們通常不會考慮像這樣使用Hashes,但它可能非常有用。
有一件事我發現有關數字鍵的哈希文字有趣的是你不能使用語法{1:'one',2:'two'}。我猜這個語法假定每個鍵都是一個符號,而整數不是。 – BlueMonkMN
是的,x:只適用於符號 – Tilo
使用對象作爲散列鍵的唯一要求是它必須以散列值響應消息散列,並且給定鍵的散列值不得更改。舉例來說,如果你把這個:
1.hash()
你可以看到,1號確實響應散列消息
我認爲它曾經是1.8。但我不確定它在1.9中仍然如此。我的意思是,在1.9中你可以免費得到一個散列。 – Candide
對,我不是故意說你必須明確地調用你想用作鍵的對象的hash() - 重要的是對象實現了hash()方法(或者'響應哈希消息',用OO的說法) –
它也必須響應'eql?'。 –
目前已經回答了關於is it possible?
。
解釋,爲什麼沒有整數作爲哈希鍵的例子。
散列鍵具有(大多數情況下)的含義。它可能是屬性名稱及其值(例如:color => 'red'
...)。
當你有一個整數作爲一個鍵,你的語義可能是'第一,第二...'(1)。但是,你不使用散列,而是一個數組來存儲你的值。
(1)反例可能是數據庫中的外鍵。
其他望着這裏的答案會覺得很有趣知道發生異常,當你在一個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
你試過了嗎?在你的控制檯上,你可以輸入IRB並獲得一個ruby控制檯..對於嘗試這種類型的東西非常有用......在主題上,你應該能夠使用整數就好。 – Deleteman
[「除了索引是通過任意對象類型的任意鍵完成的」](http://www.ruby-doc.org/core/Hash.html)。整數是Ruby中的對象,Hashes也是如此,所以你可以使用Hashes作爲鍵。 –