在 Ruby 哈希表中使用整数作为键是否合适?
文档中的每个示例都展示了使用字符串或符号作为键,但从未展示过使用整数。
在内部,整数是否会以某种方式转换为字符串?我看到了关于这个问题的一些相互矛盾的信息。
换句话说,使用整数键对哈希表是否有任何显著的不利影响?
在 Ruby 哈希表中使用整数作为键是否合适?
文档中的每个示例都展示了使用字符串或符号作为键,但从未展示过使用整数。
在内部,整数是否会以某种方式转换为字符串?我看到了关于这个问题的一些相互矛盾的信息。
换句话说,使用整数键对哈希表是否有任何显著的不利影响?
其他人看这里的答案可能会发现,如果在Ruby哈希表{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
{this: 'one',that: 'two'}
才适用此语法。它只是哈希类支持的子集。 - Tiloh = {1 => 'one', 2 => 'two', 3 => 'three'}
(1..3).each do |i|
puts h[i]
end
=>
one
two
there
irb是你的朋友!试试看吧...
.hash
就可以作为 Ruby 哈希表中的键。将对象用作哈希键的唯一要求是它必须响应消息哈希并返回哈希值,并且给定键的哈希值不能更改。例如,如果您调用此函数:
1.hash()
eql?
。 - Jörg W Mittag:color => 'red'
...)。