Подтвердить что ты не робот

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

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

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

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

[1,2,3,4,5]

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

4b9b3361

Ответ 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.