分配一个名称以字符串

时间:2015-06-17 11:39:23

标签: ruby local-variables

在这个itteration中:

a1=[1,2,3,4,5]
a2=[1,2,3,4,5]
a1.each_with_index{|a, i| ... = a + a2[i]}

我想分配给不同的局部变量b1b2,...,b5,每次迭代得到:

b1 # => 2
b2 # => 4
b3 # => 6
b4 # => 8
b5 # => 10

我试过了:

a1.each_with_index{|a, i| ('b' + i.to_s) = a + a2[i]}

但这不起作用。有人有任何想法吗?

4 个答案:

答案 0 :(得分:0)

尝试使用instance_variable_set

答案 1 :(得分:0)

您要做的事情(动态创建局部变量)对我来说并没有多大意义。为什么不使用数组呢?

a1=[1,2,3,4,5]
a2=[1,2,3,4,5]

a1.zip(a2).inject([]) { |b, (x1, x2)| b << x1 + x2 }

=> [2, 4, 6, 8, 10]

您将获得相同的结果。位置b[0]中的项目将是a1[0] + a2[0]的总和。

没有简单的方法来动态定义局部变量,因为它没有多大意义。实际上,您将很难在任何地方尝试使用这些变量,因为您的代码将依赖于运行时生成的变量。

换句话说,如果您甚至不知道是否曾生成b4,您将如何使用b4。这就是为什么数组更方便,你可以知道数组的大小并访问它的所有项目。

您可以使用eval生成本地变量,但正如我所说,它绝对不是最好的方法。

答案 2 :(得分:0)

您可以使用Binding#local_variable_set设置已存在的本地变量。但是,当您使用它来设置 new 局部变量(IOW来定义一个)时,新的局部变量将在内部 Binding对象中定义,但不会你创建它的外部Binding

同样的事情发生在eval上。直到Ruby 1.8,eval将局部变量泄露到外部范围,但是漏洞被Ruby 1.9插入。

简而言之,你想要的是不可能的。

答案 3 :(得分:0)

您必须使用Binding对象。

a1=[1,2,3,4,5]
a2=[1,2,3,4,5]
b = binding()
a1.each_with_index{ |a, i| eval("b#{i + 1} = #{a + a2[i]}", b) }
(1..5).each do |i|
    eval("puts b#{i}", b)   
end

现在设置了局部变量,您将能够通过该绑定访问它。

您可以看到示例HERE