从生成的元素创建一个新变量
Create a new variable from generated element
我想从数组元素创建一个新变量。这是一个非常糟糕的代码并且不起作用:
(1..5).each {|x| print "step " + x.to_s + ": "; name_of_variable_+_x = gets.chomp}
但我想明白我想做的事情的意义
在这种情况下,您使用带有 Array
的变量。
vars = []
(1..5).each do |x|
vars[x] = gets.chomp
puts "step #{x}: #{vars[x]}"
end
如果您真的想要定义一个变量,那么您必须使用eval
。这是一个糟糕的想法,因为您将使用一个非常危险的功能 (eval
) 来实现一个非常愚蠢的想法(定义 number-based 变量)。
您可以在 binding
上动态定义局部变量:
b = binding
b.local_variable_set("name_of_variable_#{x}", gets.chomp)
但是当你想要获得价值时,你必须一直带着那个b
,这很不方便。
稍微好一点的方法是使用实例变量,它不需要你使用绑定:
instance_variable_set("@name_of_variable_#{x}", gets.chomp)
但是当你有一系列值时,尤其是当它们被编号时,没有理由将它们分别保存在一个单独的变量中。您应该只有一个数组来保存所有信息:
variables = Array.new(5){|x| print "step #{x + 1}: "; gets.chomp}
我想从数组元素创建一个新变量。这是一个非常糟糕的代码并且不起作用:
(1..5).each {|x| print "step " + x.to_s + ": "; name_of_variable_+_x = gets.chomp}
但我想明白我想做的事情的意义
在这种情况下,您使用带有 Array
的变量。
vars = []
(1..5).each do |x|
vars[x] = gets.chomp
puts "step #{x}: #{vars[x]}"
end
如果您真的想要定义一个变量,那么您必须使用eval
。这是一个糟糕的想法,因为您将使用一个非常危险的功能 (eval
) 来实现一个非常愚蠢的想法(定义 number-based 变量)。
您可以在
binding
上动态定义局部变量:b = binding b.local_variable_set("name_of_variable_#{x}", gets.chomp)
但是当你想要获得价值时,你必须一直带着那个
b
,这很不方便。稍微好一点的方法是使用实例变量,它不需要你使用绑定:
instance_variable_set("@name_of_variable_#{x}", gets.chomp)
但是当你有一系列值时,尤其是当它们被编号时,没有理由将它们分别保存在一个单独的变量中。您应该只有一个数组来保存所有信息:
variables = Array.new(5){|x| print "step #{x + 1}: "; gets.chomp}