如何动态定义局部变量

时间:2015-02-09 05:12:38

标签: ruby metaprogramming local-variables

我想遍历一个单词字符串的数组并将它们转换为类的实例。像这样:

names_array = ["jack", "james","jim"]

names_array.each { |name| name = Person.new }

我尝试使用像(names_array.each { |name| eval(name) = Person.new }这样的eval,但这似乎不起作用。无论如何在Ruby中这样做?

修改 以前的例子对于我真正想要做的事情有点偏僻是我的代码。

students = ["Alex","Penelope" ,"Peter","Leighton","Jacob"]
students_hash = Hash.new {|hash, key| key = { :name => key, :scores => Array.new(5){|index| index = (1..100).to_a.sample} } }
students.map! {|student| students_hash[student]}

我的问题在哪里

students.each {|student_hash| eval(student_hash[:name].downcase) = Student.new(students_hash)}

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解你想要实现的目标。我假设你想用数组中的值初始化一些对象。并以允许快速访问的方式存储实例。

student_names = ['Alex', 'Penelope', 'Peter', 'Leighton', 'Jacob']

students = student_names.each_with_object({}) do |name, hash|
  student = Student.new(:name => name, :scores => Array.new(5) { rand(100) })
  hash[name.downcase] = student
end

当学生以students哈希的名义存储时,您可以通过他们的名字收到它们:

students['alex'] #=> returns the Student instance with the name 'Alex'

答案 1 :(得分:0)

你不能。见How to dynamically create a local variable?

Ruby使用绑定操作局部变量,但是这里有一个问题:绑定只能操作创建绑定时已经存在的局部变量,并且绑定创建的任何变量都是可见的只对绑定。

a = 1
bind = binding # is aware of local variable a, but not b
b = 3

# try to change the existing local variables
bind.local_variable_set(:a, 2)
bind.local_variable_set(:b, 2)
# try to create a new local variable
bind.local_variable_set(:c, 2)

a # 2, changed
b # 3, unchanged
c # NameError
bind.local_variable_get(:c) # 2
当您尝试获取/设置局部变量时,

eval具有完全相同的行为,因为它在引擎盖下使用了绑定。

你应该按照spickerman指出的方式重新思考你的代码。