Почему 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
.