使用整数作为哈希键

时间:2011-10-08 01:59:51

标签: ruby hashmap

在Ruby哈希中使用整数作为键是否合适?

文档中的每个示例都显示一个字符串或符号用作键,但从不是整数。

在内部,整数会以某种方式转换为字符串吗?我看到有关这个问题的一些相互矛盾的信息。

换句话说,对哈希使用整数键有什么明显的缺点吗?

4 个答案:

答案 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)反例可以是数据库中的外键。