我在我的应用程序中有一个构造,我需要这样的散列:
{ 1 => [6,2,2], 2 => [7,4,5], (3..7) => [7,2,1] }
因此,我希望键3、4、5、6和7具有相同的值。
上面的例子肯定不起作用,因为Ruby是智能的,并且按照给定的方式设置散列键:它将range设置为key :),因此我只能在my_hash[(3..7)]和my_hash[3]、my_hash[4]等为空的情况下访问我的值。
当然,我可以在hash之外有一个检查或构造来做我需要的事情,但是我很好奇是否有可能在hash声明之外不使用任何循环来设置这样的hash?如果不是,什么是最优雅的?谢谢!
发布于 2013-04-02 05:17:08
这有什么特别的问题吗?
myhash = { 1 => [6,2,2], 2 => [7,4,5] }
(3..7).each { |k| myhash[k] = [7,2,1] }发布于 2013-04-02 05:16:49
您可以将Hash子类化,使其更容易构造这样的散列:
class RangedHash < Hash
def []=(key, val)
if key.is_a? Range
key.each do |k|
super k, val
end
else
super key, val
end
end
end它的工作原理与普通散列相同,除了使用范围键时,它会在范围内的每一点设置给定值。
irb(main):014:0> h = RangedHash.new
=> {}
irb(main):015:0> h[(1..5)] = 42
=> 42
irb(main):016:0> h[1]
=> 42
irb(main):017:0> h[5]
=> 42
irb(main):018:0> h['hello'] = 24
=> 24
irb(main):019:0> h['hello']
=> 24发布于 2013-04-02 05:10:20
我不认为有一种方法可以使用文字散列语法来设置多个键,或者不需要一些迭代,但这里有一个使用迭代的简单方法:
irb(main):007:0> h = { 1 => [6,2,2], 2 => [7,4,5] }; (3..7).each {|n| h[n] = [7,2,1]}; h
=> {1=>[6, 2, 2], 2=>[7, 4, 5], 3=>[7, 2, 1], 4=>[7, 2, 1], 5=>[7, 2, 1], 6=>[7, 2, 1], 7=>[7, 2, 1]}(请注意,后面的; h只是为了上面的显示目的。)
https://stackoverflow.com/questions/15751693
复制相似问题