如何动态定义局部变量
How to dynamically define local variables
我想遍历一个单词字符串数组并将它们变成 class 的实例。像这样:
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)}
我不确定我是否理解你想要达到的目标。我假设您想用数组中的值初始化一些对象。并以允许快速访问的方式存储实例。
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'
你不能。参见 How to dynamically create a local variable?
Ruby 使用 bindings 操作局部变量,但这里有一个问题:绑定只能操作在创建绑定时已经存在的局部变量以及创建的任何变量通过绑定仅对绑定可见。
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
当您尝试 get/set 局部变量时,eval
具有完全相同的行为,因为它使用底层绑定。
您应该按照 spickerman 指出的思路重新考虑您的代码。
我想遍历一个单词字符串数组并将它们变成 class 的实例。像这样:
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)}
我不确定我是否理解你想要达到的目标。我假设您想用数组中的值初始化一些对象。并以允许快速访问的方式存储实例。
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'
你不能。参见 How to dynamically create a local variable?
Ruby 使用 bindings 操作局部变量,但这里有一个问题:绑定只能操作在创建绑定时已经存在的局部变量以及创建的任何变量通过绑定仅对绑定可见。
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
当您尝试 get/set 局部变量时,eval
具有完全相同的行为,因为它使用底层绑定。
您应该按照 spickerman 指出的思路重新考虑您的代码。