【问题标题】:Usage of integers as hash keys使用整数作为哈希键
【发布时间】:2011-12-03 09:43:45
【问题描述】:

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

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

在内部,整数会以某种方式转换为字符串吗?我在该主题上看到了一些相互矛盾的信息。

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

【问题讨论】:

  • 你试过了吗?在您的控制台上,您可以输入 IRB 并获得一个 ruby​​ 控制台。对于尝试此类事情非常有用...在主题上,您应该能够很好地使用整数。
  • "except that indexing is done via arbitrary keys of any object type"。整数是 Ruby 中的对象,哈希也是如此,因此您可以使用哈希作为键。

标签: ruby hashmap


【解决方案1】:

其他在此处查看答案的人可能会发现当您在 Ruby hash {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

【讨论】:

  • 这只是“新”Ruby 哈希语法的一个特性,它使用符号作为键,并在 Ruby 1.9 中引入。这不是 Ruby 的 Hash 实现的限制。此语法仅适用于您希望将符号作为键的情况,例如{this: 'one', that: 'two'}。它只是 Hash 类支持的一个子集。
【解决方案2】:

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

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

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

=>

one
two
there

irb 是你的朋友!试试看。。


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

编辑: 正如 Óscar López 所指出的,该对象只需响应 .hash 即可作为 Ruby 哈希中的键。

【讨论】:

  • 我对带有数字键的散列文字感兴趣的一点是,您不能使用语法 {1:'one', 2:'two'}。我猜语法假设每个键都是一个符号,而整数不是。
  • 这是 Ruby 1.9 Hash 语法的一个特点。这不是 Hash 类的一般限制..
【解决方案3】:

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

1.hash()

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

【讨论】:

  • 我认为在 1.8 中曾经如此。但我不太确定它在 1.9 中是否仍然正确。我的意思是,在 1.9 中,您可以免费获得哈希。
  • 对,我不是说你必须在你想用作键的对象上显式调用 hash() - 重要的是对象实现了 hash() 方法(或“响应散列消息”,用 OO 的说法)
  • 它也要回复eql?
【解决方案4】:

已经有关于is it possible?的答案。

解释,为什么没有整数作为哈希键的例子。

哈希键(大多数情况下)具有含义。它可能是一个属性名称及其值(例如:color => 'red'...)。

当你有一个整数作为键时,你的语义可能是“第一,第二……”(1)。但是你不使用散列,而是使用数组来存储你的值。

(1) 反例可能是数据库中的外键。

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2011-01-23
    • 2012-07-15
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多