使用整数作为哈希键

tim*_*one 49 ruby hashmap

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

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

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

换句话说,使用整数键到散列有什么明显的缺点吗?

Til*_*ilo 59

当然你可以使用整数作为键...

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

(1..3).each do |i|
  puts h[i]
end
Run Code Online (Sandbox Code Playgroud)

=>

one
two
there
Run Code Online (Sandbox Code Playgroud)

irb是你的朋友!试试吧..


实际上,您可以使用任何Ruby对象作为键(或值).我们通常不会考虑像这样使用Hashes,但它可能非常有用.

  • 对于带有数字键的哈希字面量,我发现有趣的一件事是,您不能使用语法{1:'one',2:'two'}。我猜想语法假设每个键都是一个符号,而整数则不是。 (3认同)

dyl*_*nkb 47

其他人在这里查看答案可能会发现,当您在Ruby哈希中使用整数作为符号键时会发生异常,这很有趣 {symbol: value}

hash = {1: 'one'} # will not work  
hash = {1 => 'one'} # will work
Run Code Online (Sandbox Code Playgroud)

请求说明:

对于第一个示例失败的原因,最简单的答案可能to_sym是不是为Fixnum整数实现的方法.

为了更深入地解释为什么会这样,使用符号的主要好处之一是两个符号实际上是"同一个对象".或者至少他们共享相同的对象ID.

:foo.object_id == :foo.object_id
=> true
Run Code Online (Sandbox Code Playgroud)

相同的字符串不共享相同的对象,因此不共享相同的对象ID.

"foo".object_id == "foo".object_id
=> false
Run Code Online (Sandbox Code Playgroud)

与符号一样,相同的Fixnum整数将具有相同的对象ID.因此,您不需要将它们转换为符号.

one = 1
=> 1
uno = 1
=> 1
one.object_id
=> 3
one.object_id == uno.object_id
=> true
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 9

将对象用作散列键的唯一要求是它必须使用散列值响应消息散列,并且给定键的散列值不得更改.例如,如果你这样称呼:

1.hash()
Run Code Online (Sandbox Code Playgroud)

您可以看到数字1确实响应了哈希消息

  • 它还必须响应`eql?`. (5认同)