这是我的散列:
x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
我试图在for循环中像x[:aN]一样迭代。我试过了,但没有成功:
for i in 1..5
x[:a#{"i"}]
end
我怎么能做这样的事?
这真的很简单:
=> x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
=> 1.upto(3) { |i| p x[:"a#{i}"] }
#> "foo"
#> "bar"
#> "baz"
参见示例:a2 == :"a#{2}"
=>true
。
使用您的方法:
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] }
不确定这是否是最好的方法,但你可以尝试这个
for i in 1..5
x[('a'+ i.to_s).to_sym]
end
你也可以试试这个:
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"
您可以使用ActiveSupport HashWithIndidifferenceAccess,它基本上允许使用符号或字符串作为相同的哈希密钥:
x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}
x1 = HashWithIndifferentAccess.new(x)
for i in 1..5
x1["a#{i}"]
end