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

Разница между картой и каждой

Возможный дубликат:
Ruby - В чем разница между картой, каждой и собирать?

Я тоже смотрел в Ruby-Doc, но я не могу понять разницу между

map
each

итераторы. Было бы здорово, если бы вы могли привести пример и объяснить.

4b9b3361

Ответ 1

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 сами не изменяют исходную коллекцию.

Ответ 2

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]