在这个itteration中:
a1=[1,2,3,4,5]
a2=[1,2,3,4,5]
a1.each_with_index{|a, i| ... = a + a2[i]}
我想分配给不同的局部变量b1
,b2
,...,b5
,每次迭代得到:
b1 # => 2
b2 # => 4
b3 # => 6
b4 # => 8
b5 # => 10
我试过了:
a1.each_with_index{|a, i| ('b' + i.to_s) = a + a2[i]}
但这不起作用。有人有任何想法吗?
答案 0 :(得分:0)
答案 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