Почему Array#each возвращает массив с одинаковыми элементами?

Я изучаю детали того, как each работает в Ruby, и я попробовал следующий код:

p [1,2,3,4,5].each { |element| el }

и результатом является массив

[1,2,3,4,5]

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

3 ответов


Array#each возвращает объект [array], на который он был вызван: результатом блока является отбрасываются. Таким образом, если нет бяка побочные эффекты к исходному массиву, то ничего не изменится.

возможно, вы хотите использовать map?

p [1,2,3,4,5].map { |i| i*i }

массив#each

блок форма массив#each возвращает исходный объект массива. Вы обычно используете #each, когда хотите do что-то с каждым элементом массива внутри блока. Например:

[1, 2, 3, 4, 5].each { |element| puts element }

Это распечатает Каждый элемент, но возвращает оригинал массив. Вы можете проверить это с:

array = [1, 2, 3, 4, 5]
array.each { |element| element }.object_id === array.object_id
=> true

массив#map

если вы хотите вернуть новая массива хотите использовать массив#карту или один из его синонимов. Блочная форма #map возвращает другой объект массива. Например:

array.object_id
=> 25659920
array.map { |element| element }.object_id
=> 20546920
array.map { |element| element }.object_id === array.object_id
=> false

вы обычно хотите использовать #map, когда вы хотите работать с измененной версией исходного массива, оставляя оригинал без изменений.


все методы возвращают что-то. Даже если это просто nil объект, он возвращает что-то.

Он может также вернуть исходный объект, а не возвращать nil.