如何在符号调用中进行迭代

时间:2014-10-21 07:46:50

标签: ruby-on-rails ruby ruby-on-rails-4

这是我的哈希:

x = {:a1 => "foo", :a2 => "bar", :a3 => "baz"}

我试图在for循环中像x [:aN]一样迭代。我尝试了这个,但没有工作:

for i in 1..5
  x[:a#{"i"}]
end

我怎么能这样做?

5 个答案:

答案 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"