为什么Array.new(10){| e | e = e + 2}产生[0 2 4 6 8 10 12 14 16 18]?

时间:2016-03-29 10:09:48

标签: arrays ruby

我不理解块在以下示例中产生的结果:

以下数组初始化:

my_arr = Array.new(10) { |e| e = e * 2 }

产生以下结果:

[0 2 4 6 8 10 12 14 16 18]

虽然我希望:[0 0 0 0 0 0 0 0 0 0]。 在我看来,元素e没有被初始化,所以最多它的值可以为零(虽然我希望得到“零”),而零次的某些数字总是返回零。或者我希望它是几何级数,而不是算术级数。所以为什么 ??? 所以一定有我想念的东西。

以下代码:

my_arr = Array.new(10) { |e| e = e + 2 }

产生以下结果:

[2, 3, 4, 5, 6, 7, 8 , 9, 10, 11]

虽然我希望:[0 2 4 6 8 10 12 14 16 18]。 在我看来,元素e没有被初始化,所以最多它的值可以为零(尽管我期望得到一个' nil')。因此它应该是2的渐进性进展,而不是1.为什么???

我检查了ruby reference并且无法找到任何线索来理解这些非直观的结果。

这个想法来自http://www.tutorialspoint.com/ruby/ruby_arrays.htm

我认为这一点依赖于解释e应该代表什么价值?

1 个答案:

答案 0 :(得分:6)

这可以写成:

Array.new(10) { |index| index * 2 } #=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

哪个与您链接的文档中的最终表单相匹配:

  

new(size) {|index| block }

创建给定大小(10)的数组。通过将元素的索引传递给给定块并存储返回值来创建此数组中的每个元素。

在初始化每个元素后,您在示例中分配给e的值将被丢弃。