2

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

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

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

4

4 回答 4

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
于 2013-04-18T05:45:40.397 回答
2

我认为你在这里把事情复杂化了。不是允许数组作为键,而是几乎任何对象都可以是键。来自精美手册

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

请注意,hashandeql?都在 Object 中,所以几乎所有你会遇到的东西都会有它们,因此可以是 Hash 中的键。对于某些任意对象,默认实现可能没有太大意义,但它们仍然存在。

有时,通用性比人为地将您的选项限制在语言设计者可以看到的用途更容易。甚至Java也没有那么严格。

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

为什么要禁止使用 Array 作为 Hash 键?

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

于 2013-04-18T05:54:49.403 回答
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,
}
于 2013-04-18T05:42:43.340 回答
-1

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

于 2013-04-18T05:09:05.570 回答