2011-04-16 2 views

ответ

48

side effects те же, которые добавляет некоторую путаницу в вашей обратной инженерии.

Да, и перебрать массив (на самом деле, все, что mixes in Enumerable), но карта возвращает массив, состоящий из результатов блока, а каждый просто возвращает исходный массив. Возвращаемое значение каждый редко используется в коде Ruby, но map является одним из most important functional tools.

BTW, у Вас может быть трудно найти в документации, потому что карта является метод перечислимых в то время как каждый (один метод требует перечислимых модуль) представляет собой метод в массиве ,

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

+5

+1 для связи «карта» с функциональным программированием. «каждый», с другой стороны, является обычной императивной петлей с побочными эффектами. – tokland

+3

Так полезно, спасибо. –

+0

Карта не кажется очень «функциональной», потому что изменение объекта, о котором идет речь, изменяет исходный объект. –

2

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

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

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

2

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

7

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

так что каждый нормальный цикл, который перебирает через каждый элемент и вызывает данный блок

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

[1,2,3].map(&:to_s) 
Смежные вопросы