2012-02-24 1 views

ответ

107

each отличается от map и collect, но map и collect одинаковы (технически map является псевдонимом для collect, но в моем опыте map используется много чаще).

each выполняет прилагаемый блок для каждого элемента в (Enumerable) приемнике:

[1,2,3,4].each {|n| puts n*2} 
# Outputs: 
# 2 
# 4 
# 6 
# 8 

map и collect производить новый Array, содержащий результаты блока, приложенный к каждому элементу приемника:

[1,2,3,4].map {|n| n*2} 
# => [2,4,6,8] 

Существует также map!/collect!, определенный по Array s; они изменяют приемник на месте:

a = [1,2,3,4] 
a.map {|n| n*2} # => [2,4,6,8] 
puts a.inspect # prints: "[1,2,3,4]" 
a.map! {|n| n+1} 
puts a.inspect # prints: "[2,3,4,5]" 
+2

карта является сообществом выбрана версия https://github.com/bbatsov/ruby-style-guide#map-fine-select-reduce-size –

21

Each оценит блок, но отбрасывает результат оценки Each блока и возвращает исходный массив.

irb(main):> [1,2,3].each {|x| x*2} 
=> [1, 2, 3] 

Map/collect возвращает массив строится как результат вызова блока для каждого элемента массива.

irb(main):> [1,2,3].collect {|x| x*2} 
=> [2, 4, 6]