Ruby 从生成的元素创建新变量

Ruby 从生成的元素创建新变量,ruby,variables,generated,Ruby,Variables,Generated,我想从数组元素创建一个新变量。这是一个非常糟糕的代码,不起作用: (1..5).each {|x| print "step " + x.to_s + ": "; name_of_variable_+_x = gets.chomp} 但是我想理解我想做的事情的含义。在这种情况下,您可以将变量与数组一起使用 vars = [] (1..5).each do |x| vars[x] = gets.chomp puts "step #{x}: #{vars[x]}" end 如果真的要定义

我想从数组元素创建一个新变量。这是一个非常糟糕的代码,不起作用:

(1..5).each {|x| print "step " + x.to_s + ": "; name_of_variable_+_x  = gets.chomp}

但是我想理解我想做的事情的含义。

在这种情况下,您可以将变量与
数组一起使用

vars = []
(1..5).each do |x|
  vars[x] = gets.chomp
  puts "step #{x}: #{vars[x]}"
end
如果真的要定义变量,则必须使用
eval
。这是一个糟糕的想法,因为您将使用一个非常危险的功能(
eval
)来实现一个非常愚蠢的想法(定义基于数字的变量)。

  • 您可以在
    绑定上动态定义局部变量

    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}
    

听起来像是你想要像
[“a”,“b”,“c”]
那样获取一个数组,并从中定义变量,就像你做了
项_0=“a”;项目1=“b”;item_2=“c”
。那么,问题是你为什么要这样做?这样做你想解决什么问题?我不得不问这个问题,因为对于任何你试图解决的问题,你试图做的几乎肯定是错误的解决方案。与其动态创建5个变量,不如创建5个元素的数组。每个变量必须包含5个不同的输入用户。问题是,我不知道新的VariableSeld计时器如何告诉我,在v1.8中,可以使用
eval
创建局部变量。在1.9+中,动态创建局部变量是不可能的。@CarySwoveland这是可能的,但你需要在绑定上创建它。所以,我很高兴,你和我一样是意大利人。我需要创建5个新变量,该变量必须包含5个不同的用户输入。您的最佳解决方案是什么?即使一个使用
eval
定义变量,也必须使用另一个
eval
来访问它-因此,从这个线程看来,您是对的。我真的不需要变量。我可以在数组中使用元素。谢谢说在1.8之后创建局部变量是不可能的(但他知道什么?)。
绑定的使用不要求局部变量已经存在吗?这与Matz所说的并不矛盾。这应该是公认的答案——它描述了如何执行OP所要求的操作,以及更好的选择。这是绑定的一个有趣用法。我以前没见过。