В Ruby существует ли разница между функциональными возможностями each, map и collect?
В чем разница между картой, каждой и коллекцией?
Ответ 1
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
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]