在Stack Overflow上阅读各种说明后,它们被描述如下:
Map(映射):
Map方法接受一个可枚举对象和一个块,并针对每个元素运行该块
Inject(注入):
Inject方法需要一个值和一个块,对列表中的每个元素运行该块。
希望您理解为什么我觉得它们在表面上看起来非常相似。在何时应选择其中之一?它们之间是否有明显的区别?
在Stack Overflow上阅读各种说明后,它们被描述如下:
Map(映射):
Map方法接受一个可枚举对象和一个块,并针对每个元素运行该块
Inject(注入):
Inject方法需要一个值和一个块,对列表中的每个元素运行该块。
希望您理解为什么我觉得它们在表面上看起来非常相似。在何时应选择其中之一?它们之间是否有明显的区别?
如果你考虑到inject
也被别名为reduce
,会更有帮助。map
用于转换列表,例如将数组中的所有字符串转换为大写,而inject
则使用一个参数(通常是累加器)并对其进行修改。
示例:
%w(a b c).map(&:upcase) #=> ["A", "B", "C"]
[*1..4].inject(:+) #=> 10
如果您想阅读更多内容,inject
的作用被称为fold。
(1..4).sum #=> 10
更易读和直观。 - nroose(1..4).sum #=> NoMethodError: undefined method
sum' for 1..4:Range`。 - Michael Kohlinject
接收一个对象作为参数,对其进行一些操作并返回修改后的对象。
arr = []
[1,2].inject(arr) { |s,e| s << e }
arr # => [1,2]
arr
,但在调用#inject
后,在块内进行了concatenation
操作,并将其添加到arr
中。之后我打印出它,我可以看到arr
现在包含条目,它们是1,2
。
map
创建一个新的Enumerable
对象,该对象基于您调用它的接收器Enumerable
对象创建。它将从接收器中获取每个元素,并执行一些操作,然后将其放入新的可枚举元素中,然后继续进行下一个操作,以此类推...arr = [1,2]
arr.map { |e| e + 1 } # => [2,3]
arr # => [1,2]
#map
,块将每个参数逐个加1,然后将递增的值放在新数组中与原始元素取自相同的索引处。但是,最终的数组是一个全新的数组,与arr
没有任何关联。当我执行p arr
时,我得到的是在#map
操作开始之前arr
中具有相同内容的结果。inject
时,通常会返回一个值(通常用于数学),而使用map时会返回一个数组。a.inject([])
和 ({})
, - Cary Swoveland
map
和inject
的官方文档吗? - toro2k