web-dev-qa-db-ja.com

ハッシュキーとしての整数の使用

Rubyハッシュのキーとして整数を使用するのは適切ですか?

ドキュメントのすべての例は、キーとして使用される文字列またはシンボルを示していますが、整数ではありません。

内部的には、整数は何らかの形で文字列に変換されますか?私はこの件に関するいくつかの矛盾する情報を見てきました。

言い換えれば、ハッシュに整数キーを使用することには重大な欠点がありますか?

48
timpone

もちろん、整数をキーとして使用できます...

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

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

=>

one
two
there

irbはあなたの友達です!それを試してみてください..


実際、キー(または値)としてany Ruby objectを使用できます。通常、このようなハッシュの使用については考えていませんが、有用。

57
Tilo

ここの答えを見ている他の人は、 Ruby hash{symbol: value}で整数をシンボルキーとして使用すると例外が発生することを知るのは興味深いかもしれません

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

要求された説明:

最初の例が失敗する理由の最も簡単な答えは、おそらくto_symFixnum integersに対して実装されているメソッドではないということです。

その理由をさらに詳しく説明すると、シンボルを使用する主な利点の1つは、2つのシンボルが実際には「同じオブジェクト」であることです。または、少なくとも同じオブジェクト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
44
dylankb

オブジェクトをハッシュキーとして使用するための唯一の要件は、オブジェクトがハッシュ値でメッセージハッシュに応答する必要があり、特定のキーのハッシュ値が変更されないことです。たとえば、これを呼び出す場合:

1.hash()

数字の1が実際にハッシュメッセージに応答することがわかります。

9
Óscar López

is it possible?に関する回答は既にあります。

説明、ハッシュキーとして整数を使用する例がない理由。

ハッシュキーには(ほとんどの場合)意味があります。属性名とその値(例::color => 'red'...)。

キーとして整数を使用する場合、セマンティックは「first、second ...」(1)になります。ただし、ハッシュを使用するのではなく、配列を使用して値を保存します。

(1)反例は、データベース内の外部キーです。

3
knut