在Ruby哈希中使用整数作为键是否合适?
文档中的每个示例都显示一个字符串或符号用作键,但从不是整数。
在内部,整数会以某种方式转换为字符串吗?我看到有关这个问题的一些相互矛盾的信息。
换句话说,对哈希使用整数键有什么明显的缺点吗?
答案 0 :(得分:56)
当然你可以使用整数作为键......
h = {1 => 'one', 2 => 'two', 3 => 'three'}
(1..3).each do |i|
puts h[i]
end
=>
one
two
there
irb是你的朋友!试试吧..
实际上,您可以使用任何Ruby对象作为键(或值)。 我们通常不会考虑使用像这样的哈希,但它可能非常有用。
答案 1 :(得分:42)
其他人在这里查看答案可能会发现在Ruby hash {symbol: value}
hash = {1: 'one'} # will not work
hash = {1 => 'one'} # will work
请求说明:
第一个示例失败原因的最简单答案可能是to_sym
不是为Fixnum整数实现的方法。
为了更深入地解释为什么会这样,使用符号的主要好处之一是两个符号实际上是#34;同一个对象"。或者至少它们共享相同的对象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
答案 2 :(得分:9)
将对象用作散列键的唯一要求是它必须使用散列值响应消息散列,并且给定键的散列值不得更改。例如,如果你这样称呼:
1.hash()
您可以看到数字1确实响应了哈希消息
答案 3 :(得分:3)
关于is it possible?
已有答案。
解释,为什么没有整数作为哈希键的例子。
哈希键(大多数时候)具有意义。它可以是属性名称及其值(例如:color => 'red'
...)。
当你有一个整数作为键时,你的语义可能是'第一,第二......'(1)。但是你不使用散列,而是使用数组来存储你的值。
(1)反例可以是数据库中的外键。