Ruby 如何使用字符串的值引用变量?

Ruby 如何使用字符串的值引用变量?,ruby,Ruby,一些程序员提出了一种方法,这种方法可以得到很多这样的论点: def age_entry(age_1, age_2, age_3, age_4, age_5, age_6, age_7, age_8) end (1..8).each do |index| do ages << "age_" + index #value of age_[index] get saved to ages end 他们可以通过一个数组,但根本没有。我喜欢自动化,讨厌像这样重复地将这些变量添加到和数

一些程序员提出了一种方法,这种方法可以得到很多这样的论点:

def age_entry(age_1, age_2, age_3, age_4, age_5, age_6, age_7, age_8)
end
(1..8).each do |index| do
   ages << "age_" + index #value of age_[index] get saved to ages
end
他们可以通过一个数组,但根本没有。我喜欢自动化,讨厌像这样重复地将这些变量添加到和数组中

ages = [age_1, age_2, age_3 ,..., age_8]
我想使用元编程或其他方法与for或each方法循环,将它们添加到数组中,如下所示:

def age_entry(age_1, age_2, age_3, age_4, age_5, age_6, age_7, age_8)
end
(1..8).each do |index| do
   ages << "age_" + index #value of age_[index] get saved to ages
end

另外,我知道我可以使用复制和粘贴,但这只用于使用Ruby进行自动化操作。

这里不需要任何元编程。只需向他们展示:

ages = [age_1, age_2, age_3 ,..., age_8]
#         ⇓ HERE
age_entry(*ages)
如果要将年龄_1..8收集到数组中,假设定义了所有本地变量,请使用:


这里不需要任何元编程。只需向他们展示:

ages = [age_1, age_2, age_3 ,..., age_8]
#         ⇓ HERE
age_entry(*ages)
如果要将年龄_1..8收集到数组中,假设定义了所有本地变量,请使用:


有些程序员应该记住,可以传入数组。由于许多原因,这种方法签名确实令人讨厌,其中一些原因你已经发现了

重构此方法并保留功能的一种方法是只接受varargs:

现在,这些值被放入一个数组中,但是您可以像以前一样调用该方法。另外,您可以指定更多或更少的条目


名称为x1、x2等的变量违反了,这表明您需要以不同的方式思考问题。

一些程序员应该记住,您可以传入数组。由于许多原因,这种方法签名确实令人讨厌,其中一些原因你已经发现了

重构此方法并保留功能的一种方法是只接受varargs:

现在,这些值被放入一个数组中,但是您可以像以前一样调用该方法。另外,您可以指定更多或更少的条目


名称为x1、x2等的变量违反了,并且是一个需要以不同方式思考问题的标志。

假设方法如下

def oldest(age_bill, age_barb, age_trixie)
  puts "Barb is #{age_barb} years old"
  [age_bill, age_barb, age_trixie].max
end

oldest(35, 97, 29)
  #=> 97
除了OP希望避免的倒数第二行的计算外,该方法还需要了解单个方法参数age_barb。以下是实现这两个需求的一种方法

def oldest(age_bill, age_barb, age_trixie)
  puts "Barb is #{age_barb} years old"
  b = binding
  args = method(__method__).parameters.map { |arg| b.local_variable_get(arg[1]) }
  args.max
end
  #=> 97
Barb is 97 years old
这里


假设方法如下

def oldest(age_bill, age_barb, age_trixie)
  puts "Barb is #{age_barb} years old"
  [age_bill, age_barb, age_trixie].max
end

oldest(35, 97, 29)
  #=> 97
除了OP希望避免的倒数第二行的计算外,该方法还需要了解单个方法参数age_barb。以下是实现这两个需求的一种方法

def oldest(age_bill, age_barb, age_trixie)
  puts "Barb is #{age_barb} years old"
  b = binding
  args = method(__method__).parameters.map { |arg| b.local_variable_get(arg[1]) }
  args.max
end
  #=> 97
Barb is 97 years old
这里


你是说age_entry*1..8?你是说age_entry*1..8?@CarySwoveland我只是在处理指定的内容,那里的代码有这些通用的序列类型变量,另外这个问题还包括关于添加任意数字引用的问题。如果这些变量确实不同,则应相应地对它们进行标记。@CarySwoveland我正在处理指定的内容,那里的代码包含这些泛型序列类型变量,此外,问题还包括对它们的任意数字引用的相加问题。如果它们真的不同,应该相应地贴上标签。这与@mudasobwa的答案相反。他将方法的参数替换为*args,然后根据需要提取各个参数。我将各个参数保持原样,并构造它们的值的数组。既然您在这里使用了所有元,为什么不使用b=binding和b.local\u variables.lazy.select&method\uuuuu方法\uuuuuu.parameters.map&:last.method:include?.map&b.method:local\u variable\u get.max:这与@mudasobwa的答案相反。他将方法的参数替换为*args,然后根据需要提取各个参数。我将各个参数保持原样,并构造它们的值的数组。既然您在这里使用了所有元,为什么不使用b=binding和b.local\u variables.lazy.select&method\uuuuu方法\uuuuu.parameters.map&:last.method:include?.map&b.method:local\u variable\u get.max:重新定义签名是一个好办法,但是,如果出于某种原因而坚持使用第二种方法,可以使用方法\uuuu方法\uuuuu.arity而不是硬编码的8。重新定义签名是一条路,但是如果出于某种原因而坚持使用第二种方法,则可以使用方法\uuu方法\uuuuuu.arity而不是硬编码的8使它变得更好。