从生成的元素创建一个新变量

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}