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

Как различаются array.each и array.map?

Возможный дубликат:
Массив # по отношению к массиву # карты

ruby-1.9.2-p180 :006 > ary = ["a", "b"]
 => ["a", "b"] 
ruby-1.9.2-p180 :007 > ary.map { |val| p val }
"a"
"b"
 => ["a", "b"] 
ruby-1.9.2-p180 :008 > ary.each { |val| p val }
"a"
"b"
 => ["a", "b"] 

ruby-1.9.2-p180 :009 > ary.map { |val| val << "2" }
 => ["a2", "b2"] 
ruby-1.9.2-p180 :010 > ary.each { |val| val << "2" }
 => ["a22", "b22"] 
4b9b3361

Ответ 1

побочные эффекты - это то же самое, что добавляет некоторую путаницу в вашу обратную инженерию.

Да, итерация по массиву (на самом деле, все, что смешивается в Enumerable), но карта вернет массив, состоящий из результатов блока, пока каждый из них просто вернет исходный массив. Возвращаемое значение каждого из них редко используется в коде Ruby, но карта является одним из наиболее важных функциональных инструментов.

Кстати, вам может быть трудно найти документацию, потому что map - это метод в Enumerable, в то время как каждый (один метод, требуемый модулем Enumerable) является методом в массиве.

Как мелочи: реализация карты основана на каждом.

Ответ 2

из документов API: each: вызывает блок один раз для каждого элемента в self, передавая этот элемент в качестве параметра. map: вызывает блок один раз для каждого элемента self. Создает новый массив, содержащий значения, возвращаемые блоком.

поэтому каждый из них является обычным циклом, который выполняет итерацию через каждый элемент и вызывает заданный блок

как правило, используется, когда вы хотите, чтобы другой массив сопоставлялся некоторой логикой с существующей. Вы также можете передать метод в качестве ссылки на функцию карты, например

[1,2,3].map(&:to_s)

Ответ 3

Массив # map - это коллекция того, что возвращается в заблокированном для каждого элемента.

Array # каждый выполняет блок кода для каждого элемента, а затем возвращает сам список.

Вы должны проверить эту массив Array # each vs. Array #.

Ответ 4

Каждый из них - это просто итератор, который получает следующий элемент итерации и передает его блоку. Карта используется для повторения, но сопоставляет элементы с чем-то другим, например значением, умноженным на константу. В ваших примерах их можно использовать взаимозаменяемо, но каждый из них является более общим итератором, который передает элемент в блок.