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

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

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

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

[1,2,3,4,5]

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

Ответ 1

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

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

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

Ответ 2

Массив # каждый

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

[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

Массив # карта

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

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

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

Ответ 3

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

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