我想遍历一个单词字符串的数组并将它们转换为类的实例。像这样:
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)}
答案 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指出的方式重新思考你的代码。