【问题标题】:Dynamically creating local variables in Ruby [duplicate]在Ruby中动态创建局部变量[重复]
【发布时间】:2011-04-21 08:08:17
【问题描述】:

我有一个 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: 未定义的局部变量或 main:Object 的方法 `a' (NameError)

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

有人知道我该怎么做吗?

【问题讨论】:

  • 不要那样做。改用方法(参见 OpenStruct)。

标签: ruby variables dynamic


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

require 'ostruct'

x = OpenStruct.new

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

【讨论】:

  • 在 rails 中不需要 'ostruct' :)
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2013-09-04
  • 1970-01-01
  • 2014-10-06
  • 2018-11-23
  • 2013-12-21
  • 1970-01-01
  • 2018-08-27
相关资源
最近更新 更多