在Ruby中动态创建局部变量

我有一个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”

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

您可以使用openstruct获得类似的效果

 require 'ostruct' x = OpenStruct.new headers = ["a", "b"] headers.each do |h| x.send("#{h}=", 1) end puts xa puts xb 

给出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或更高版本。