在Ruby中动态创建局部变量

时间:2010-10-05 14:14:24

标签: ruby variables dynamic

我有一个CSV文件,我正在解析并在数据库中插入它的位。我想编写一个解析器,它考虑到列顺序将来可能发生变化这一事实。

我认为我可以通过将标题行作为数组抓取来完成此操作,并且对于每一行,将值放在动态创建的局部变量中(使用eval)。然而,这似乎不起作用,因为局部变量似乎不能在eval之外访问。我在其他地方读过,这在ruby 1.9中可能是正确的,但我使用的是1.8.7

代码如:

headers = ["a", "b"]
  headers.each do |h|
  p e_str = h+"=1"
  eval(e_str)
end
puts a

根本不起作用,给予

  

test.rb:6:未定义的局部变量或   方法`a'用于main:Object(NameError)

虽然第3行按预期打印“a = 1”和“b = 1”

有谁知道我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

鉴于data.csv

"foo","bar","baz"
1,2,3
4,5,6

然后

#!/usr/bin/ruby1.8

require 'csv'

rows = CSV.readlines('data.csv')
header = rows[0]
data = rows[1..-1].map do |row|
  {}.tap do |h|
    header.each.with_index.map do |name, i|
      h[name] = row[i]
    end
  end
end

p data
# => [{"baz"=>"3", "foo"=>"1", "bar"=>"2"}, {"baz"=>"6", "foo"=>"4", "bar"=>"5"}]

注意:需要1.8.7或更高版本。

答案 1 :(得分:1)

使用openstruct

可以获得类似的效果
require 'ostruct'

x = OpenStruct.new

headers = ["a", "b"]
headers.each do |h|
  x.send("#{h}=", 1)
end
puts x.a
puts x.b