使用数组作为ruby散列键的用例

时间:2013-04-18 05:03:44

标签: ruby arrays hash

Ruby允许使用数组作为哈希键,如下所示:

hash1 = {1 => "one", [2] => 'two', [3,4] => ['three', 'four']}

我不清楚这是什么常见用例。如果人们可以分享一些有用的真实场景,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

为什么您希望将数组存储为哈希键的一个很好的例子是用于记忆。

这是一个如何将数组作为散列键有用的示例:

def initialize(*args)
  @memoizer ||= {}
  return @memoizer[args] if @memoizer[args]
  # do what you will with the args in this initializer, 
  # then create a new instance for the future.
  @memoizer[args] = some_calculation(args)
end

答案 1 :(得分:2)

我认为你在这里过于复杂。并不是允许Arrays作为键,而是几乎所有对象都可以作为键。来自fine manual

  

Hash是一个类似字典的唯一键及其值的集合。也称为关联数组,它们类似于数组,但是当数组使用整数作为索引时,哈希允许您使用任何对象类型。
  [...]
  如果覆盖hasheql?方法以提供有意义的行为,则可以将用户定义的类用作散列键。

请注意,hasheql?都在对象中,因此您遇到的几乎所有内容都会包含它们,因此可以成为哈希中的密钥。对于某些任意对象,默认实现可能不是非常有意义,但它们仍然存在。

有时,通用性比人为地将选项仅限于语言设计者可以看到的用途更容易。甚至Java都不严格。

我想我想说的是我认为你问的是错误的问题。你应该问的问题是:

  

为什么禁止将数组用作哈希键?

这是Ruby,其中(几乎)默认允许所有内容,所以这个问题的答案是我们不想人为地限制你的选择,这里有很多可能性,去做一些奇妙的事情。

答案 2 :(得分:0)

如果密钥有某种结构,您可能希望直接使用:

{
  %w[John Travolta] => :foo,
  %w[Olivia Newton John] => :bar,
}

奥赛罗/黑白棋板的初始状态

Hash.new(:green).merge{
  [4, :d] => :white,
  [4, :e] => :black,
  [5, :d] => :black,
  [5, :e] => :white,
}

答案 3 :(得分:-1)

从您的示例中可以看出,它可以用于更有效地存储大型和/或稀疏矩阵。如您所见,如果3和4都共享相同的值,则可以将它们“压缩”为单个引用。可能会有更多正式的数据结构可以使用它,但是我使用“正式”数据结构已经有一段时间了,所以我想不出任何副作用。