我想从数组元素创建一个新变量。这是一个非常糟糕的代码,不起作用:
(1..5).each {|x| print "step " + x.to_s + ": "; name_of_variable_+_x = gets.chomp}
但我想了解我想要做的事情。
答案 0 :(得分:2)
这是您使用带Array
的变量的情况。
vars = []
(1..5).each do |x|
vars[x] = gets.chomp
puts "step #{x}: #{vars[x]}"
end
如果确实想要定义变量,则必须使用eval
。这是一个糟糕的主意,因为你将使用一个非常危险的特性(eval
)来实现一个非常愚蠢的想法(定义基于数字的变量)。
答案 1 :(得分:1)
您可以在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}