Как различаются 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"]
Ответы
Ответ 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
Каждый из них - это просто итератор, который получает следующий элемент итерации и передает его блоку. Карта используется для повторения, но сопоставляет элементы с чем-то другим, например значением, умноженным на константу. В ваших примерах их можно использовать взаимозаменяемо, но каждый из них является более общим итератором, который передает элемент в блок.