我不喜欢为范围内的每个可能条目创建单独的键/值对。它根本无法扩展,特别是对于广泛的范围。考虑这个小范围:
'a' .. 'zz'
这将导致702个额外的键。尝试('a'..'zz').to_a
的乐趣。前进。我会等。
而不是创建密钥,拦截查找。重用RangedHash
类名称:
class RangedHash < Hash
def [](key)
return self.fetch(key) if self.key? key
self.keys.select{ |k| k.is_a? Range }.each do |r_k|
return self.fetch(r_k) if r_k === key
end
nil
end
end
foo = RangedHash.new
foo[1] = [6,2,2]
foo[2] = [7,4,5]
foo[3..7] = [7,2,1]
此时foo
样子:用于测试的方法
{1=>[6, 2, 2], 2=>[7, 4, 5], 3..7=>[7, 2, 1]}
:
require 'pp'
3.upto(7) do |i|
pp foo[i]
end
,输出:
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
对于任何价值i在一个范围内,输出与该范围相关的值。超出范围但仍在散列中定义的值正常工作,对散列中不存在的键返回nil
也是如此。而且,它保持尽可能小的散列。
这个问题或任何问题的解决方案的缺点是范围可能重叠导致冲突的关键。在大多数提议的解决方案中,键会彼此跺脚,这可能最终会返回错误的值。这种方法不会这样做,因为它会直接冲突来覆盖范围键。
要解决这个问题,需要确定是否允许重叠,如果是,是否可以返回找到的第一个,或者是否存在确定“最佳拟合”的逻辑,即最小范围完全适合或者其他一些标准。或者,如果价值相同,应该重叠加入一个更大的范围?这是一个蠕虫的罐头。
你想要什么不清楚?你想要什么输出?你有什么投入? –
@iAmRubuuu我认为这很清楚,他们正在寻找一种方法来轻松初始化Hashes,而无需循环,他们可以指定一系列具有相同值的键。 –
[如何引用哈希键中的值]的可能重复(http://stackoverflow.com/questions/8379814/how-to-reference-a-value-for-a-key-in-a-哈希) –