0

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

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

我知道创建了一个具有十个值的新数组,但是后半部分在做什么?

4

2 回答 2

5

让我们详细讨论一下:

nums = Array.new(10)

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

{ |e| e = e * 2 }

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

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

编辑

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

Array.new(10) { |e| e * 2 }
于 2016-03-24T19:44:24.530 回答
2

你的代码做什么

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

在 IRB 或 Pry 中逐步分解它,看看你的代码到底在做什么。例如:

  1. Array.new(10)创建一个包含 10 个元素的数组。
  2. Array.new(10) { |e| puts e }打印每个元素的索引,即 0..9。
  3. 该构造{ |e| e = e * 2 },或者更惯用{ |e| e * 2 }的说法,是一个 Ruby 块,它将传递给块变量e的每个元素的索引乘以2。
  4. nums = Array.new(10) { |e| e = e * 2 }获取块的结果并将其存储在变量nums中。

请注意,这个存储的数组是通过Array#new的块形式创建的,这说明在使用构造函数的块形式时:

[A]n 给定大小的数组被创建。该数组中的每个元素都是通过将元素的索引传递给给定块并存储返回值来创建的。

原始帖子中的示例当然是有效的 Ruby 代码,但不是特别清楚。使用更明确的代码可以得到相同的结果,例如下面的示例。

许多更清晰的选择之一

做事的方法总是不止一种,尤其是在 Ruby 中。如果您想更明确地了解您的代码在做什么,请使用不那么“神奇”的构造。例如,您的代码大致相当于:

num_array = 0.upto(9).map { |int| int * 2 }
#=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
于 2016-03-24T19:59:41.290 回答