这是我的哈希:
x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
我试图在for循环中像x [:aN]一样迭代。我尝试了这个,但没有工作:
for i in 1..5
x[:a#{"i"}]
end
我怎么能这样做?
答案 0 :(得分:2)
这很简单:
=> x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
=> 1.upto(3) { |i| p x[:"a#{i}"] }
#> "foo"
#> "bar"
#> "baz"
查看示例:a2 == :"a#{2}"
=> true
。
答案 1 :(得分:0)
使用你的方法:
for i in 1..5
x["a#{"i"}".to_sym]
end
使用更红宝石的方式:
keys = x.keys.select { |k| k.to_s.starts_with?("a") }
keys.each { |k| x[k.to_sym] }
答案 2 :(得分:0)
不确定这是否是最好的方法,但你可以试试这个
for i in 1..5
x[('a'+ i.to_s).to_sym]
end
答案 3 :(得分:0)
您可以使用ActiveSupport HashWithIndifferentAccess,它基本上允许使用符号或字符串作为相同的哈希键:
x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
x1 = HashWithIndifferentAccess.new(x)
for i in 1..5
x1["a#{i}"]
end
答案 4 :(得分:0)
你也可以试试这个:
2.1.2 :017 > x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
=> {:a1=>"foo", :a2=>"bar", :a3=>"baz"}
2.1.2 :018 > for i in 1..x.length
2.1.2 :019?> p x["a#{i}".to_sym]
2.1.2 :020?> end
"foo"
"bar"
"baz"