如何在符号调用中迭代



这是我的散列:

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

最新更新