Ruby允许使用数组作为哈希键,如下所示:
hash1 = {1 => "one", [2] => 'two', [3,4] => ['three', 'four']}
我不清楚这是什么常见用例。如果人们可以分享一些有用的真实场景,我将不胜感激。
答案 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是一个类似字典的唯一键及其值的集合。也称为关联数组,它们类似于数组,但是当数组使用整数作为索引时,哈希允许您使用任何对象类型。
[...]
如果覆盖hash
和eql?
方法以提供有意义的行为,则可以将用户定义的类用作散列键。
请注意,hash
和eql?
都在对象中,因此您遇到的几乎所有内容都会包含它们,因此可以成为哈希中的密钥。对于某些任意对象,默认实现可能不是非常有意义,但它们仍然存在。
有时,通用性比人为地将选项仅限于语言设计者可以看到的用途更容易。甚至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都共享相同的值,则可以将它们“压缩”为单个引用。可能会有更多正式的数据结构可以使用它,但是我使用“正式”数据结构已经有一段时间了,所以我想不出任何副作用。