给出"Array.new(10){| e | e = e*2}"的Array#new工作的块形式如何?

Kev*_*bie 0 ruby arrays constructor ruby-block

我无法理解花括号内的部分.

Array.new(10) { |e| e = e * 2 }
# => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]   
Run Code Online (Sandbox Code Playgroud)

我知道创建了一个包含十个值的新数组,但下半部分是做什么的?

Tec*_*noh 5

让我们详细介绍一下:

nums = Array.new(10)
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含10个元素的新数组.对于每个数组元素,它将控制权传递给由以下指定的块:

{ |e| e = e * 2 }
Run Code Online (Sandbox Code Playgroud)

|e|代表元素的索引.索引是数组中的位置.这从0开始,到9结束,因为数组有10个元素.第二部分将索引乘以2并返回该值.这是因为e * 2,作为块中的最后一个语句,返回.然后将返回的值应用于该元素的值.所以我们最终得到以下数组:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Run Code Online (Sandbox Code Playgroud)

编辑

正如pjs所提到的那样,为了避免出现问题,编写相同代码的更简单方法是:

Array.new(10) { |e| e * 2 }
Run Code Online (Sandbox Code Playgroud)

  • 可能值得指出的是,'e = e*2`可以简化为'e*2`. (2认同)