уменьшить / ввести ошибку, если я использую функцию 'p' в блоке ввода - PullRequest
2 голосов
/ 28 января 2012

Я набрал следующий код в irb:

(1..5).reduce([]){|a,b| p a,b }

Ожидаемые результаты будут:

[]
1
[]
2
[]
3
[]
4
[]
5
=> []

Поскольку я не изменял в любой точке, возвращаемое значение inject будет []

Но по странной причине я получаю это:

[]
1
[[], 1]
2
[[[], 1], 2]
3
[[[[], 1], 2], 3]
4
[[[[[], 1], 2], 3], 4]
5
=> [[[[[[], 1], 2], 3], 4], 5]

Почему возвращаемое значение inject изменилось по сравнению с исходным, когда я даже не изменил его? Может кто-нибудь, пожалуйста, пролить свет на это.

Я использую МРТ 1.9.2

Спасибо

1 Ответ

6 голосов
/ 28 января 2012

Enumerable # Reduce выполняет следующее: выполняет итерацию по каждому элементу в перечисляемом элементе и передает его в качестве второго параметра блока. Первый параметр - это значение, возвращаемое блоком для предыдущего элемента. reduce аргумент ([] в вашем случае) передается как первый параметр блока только для первого вызова блока (в документации он называется initial value).

p печатает результат и возвращает значение его аргументов. Это значение передается следующему вызову блока в качестве первого аргумента, поскольку p вызов является последним выражением в блоке и считается возвращаемым значением этого блока.

Чтобы получить ожидаемый результат, верните первый аргумент блока из вашего блока:

(1..5).reduce([]) { |a,b| 
  p a,b
  a # then the first block argument will be the same for each block call 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...