使用数组作为ruby哈希键的用例
Ruby允许使用数组作为哈希键,如下所示:使用数组作为ruby哈希键的用例,ruby,arrays,hash,Ruby,Arrays,Hash,Ruby允许使用数组作为哈希键,如下所示: hash1 = {1 => "one", [2] => 'two', [3,4] => ['three', 'four']} 我不清楚这种情况的常见用例是什么。如果人们能分享一些现实世界中有用的场景,我将不胜感激。从您的示例来看,它似乎可以用于更有效地存储大型和/或稀疏矩阵。如您所见,如果3和4都共享相同的值,则可以将它们“压缩”到单个引用中。可能会有更多的正式数据结构使用这种方法,但我已经有一段时间没有使用“正式”数据结构了,所以
hash1 = {1 => "one", [2] => 'two', [3,4] => ['three', 'four']}
我不清楚这种情况的常见用例是什么。如果人们能分享一些现实世界中有用的场景,我将不胜感激。从您的示例来看,它似乎可以用于更有效地存储大型和/或稀疏矩阵。如您所见,如果3和4都共享相同的值,则可以将它们“压缩”到单个引用中。可能会有更多的正式数据结构使用这种方法,但我已经有一段时间没有使用“正式”数据结构了,所以我不能马上想到任何方法 如果密钥具有某种结构,您可能希望直接使用:
{
%w[John Travolta] => :foo,
%w[Olivia Newton John] => :bar,
}
Otherlo/Reversi板的初始状态
Hash.new(:green).merge{
[4, :d] => :white,
[4, :e] => :black,
[5, :d] => :black,
[5, :e] => :white,
}
将数组存储为散列键的一个很好的例子是用于记忆 这是一个将数组用作哈希键的示例:
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
我觉得你把事情搞得太复杂了。并不是数组可以作为键,而是几乎任何对象都可以是键。从: 散列是唯一键及其值的类似字典的集合。也称为关联数组,它们类似于数组,但当数组使用整数作为索引时,哈希允许使用任何对象类型。
[…]
如果覆盖
hash
和eql?
方法以提供有意义的行为,则可以将用户定义的类用作哈希键
请注意,和都在对象中,所以您遇到的几乎所有东西都有它们,因此可以是散列中的键。对于某些任意对象,默认实现可能意义不大,但它们仍然存在
有时,通用性比人为地将选项限制在语言设计者可以看到其用途的选项更容易。甚至没有那么严格
我想我想说的是我认为你问错了问题。你应该问的问题是:
为什么要禁止将数组用作哈希键
这是Ruby,默认情况下(几乎)一切都是允许的,所以这个问题的答案是,我们不想人为地限制您的选择,这里有一大堆可能性,用它做一些奇妙和意想不到的事情。术语检查:
1
,[2]
,[3,4]
不是散列索引,它们是散列键。@sawa:不是类,只是一种通用的优化/缓存技术。在Perl中,所有哈希键都是字符串。在Perl中,我们将使用类似于“@ary”
的东西将数组转换为字符串,在Ruby中类似于ary。将(',')
作为键连接,同样的失败是,元素顺序不同的数组将生成不同的键,允许在hash.或更糟的情况下(在Perl中)重复条目,您必须假设所有参数都可以进行有意义的字符串化,而定制对象很少是这种情况。