Возможный дубликат:
Ruby - В чем разница между картой, каждой и собирать?
Я тоже смотрел в Ruby-Doc, но я не могу понять разницу между
map
each
итераторы. Было бы здорово, если бы вы могли привести пример и объяснить.
Возможный дубликат:
Ruby - В чем разница между картой, каждой и собирать?
Я тоже смотрел в Ruby-Doc, но я не могу понять разницу между
map
each
итераторы. Было бы здорово, если бы вы могли привести пример и объяснить.
each
просто выполняет итерацию по данному перечислимому, запустив блок для каждого значения. Он отбрасывает возвращаемое значение блока, и каждый из них просто возвращает исходный объект, на который он был вызван:
[1, 2, 3].each do |i|
i + 1
end # => [1, 2, 3]
Это просто более удобный и универсальный способ выполнения традиционного цикла итерации for
, а each
гораздо предпочтительнее, чем циклы for
в Ruby (на самом деле, я не думаю, что когда-либо использовал a for
в Ruby).
map
, однако, итерации по каждому элементу, используя возвращаемое значение блока для заполнения нового массива при каждом соответствующем индексе и верните этот новый массив:
[1, 2, 3].map do |i|
i + 1
end # => [2, 3, 4]
Поэтому он "сопоставляет" каждый элемент с новым, используя заданный блок, отсюда и название "карта". Обратите внимание, что ни each
, ни map
сами не изменяют исходную коллекцию.
each
возвращает исходный объект. Он использовался для запуска операции с использованием каждого элемента массива без сбора каких-либо результатов. Например, если вы хотите напечатать список чисел, вы можете сделать что-то вроде этого:
arr = [1, 2, 3, 4]
arr.each { |n| puts n }
Теперь этот метод puts
выше возвращает nil
. Некоторые люди этого не знают, но это не имеет большого значения; нет реальной причины для сбора этого значения (если вы хотите преобразовать arr
в строки, вы должны использовать arr.map(&:to_s)
или arr.map { |n| n.to_s }
.
map
возвращает результаты блока, который вы передаете ему. Это отличный способ запустить операцию над каждым элементом массива и получить результаты. Если вы хотите, чтобы каждый элемент массива был равен 2, это естественный выбор. В качестве бонуса вы можете изменить исходный объект, используя map!
. Например:
arr = [1, 2, 3, 4]
arr.map! { |n| n * 2}
# => [2, 4, 6, 8]