在这里阅读各种解释,因此它们被描述为:
地图:
地图方法采用一个枚举的对象和一个块,并为每个元素运行块
注入:
注入为一个值和一个块,它可以为列表的每个元素运行一次。
希望您理解为什么我觉得它们在表面上看起来很相似。我什么时候可以选择另一个,它们之间是否有明显的差异?
,如果您认为inject
也将其视为reduce
,它会有所帮助。map
用于转换列表,例如将数组中的所有字符串转换为大写,而inject
进行参数(通常是累加器)并修改。
示例:
%w(a b c).map(&:upcase) #=> ["A", "B", "C"]
[*1..4].inject(:+) #=> 10
如果您想阅读更多,inject
的作用称为折叠。
inject
以对象为参数,并进行了一些操作并返回该修改的对象。
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
,Block正在采用每个参数并通过1
进行递增,并且它在新数组中列出了相同的索引的增量值,其索引从中获取了原始元素。但是最终数组是一个新数组,与arr
没有连接。当我做p arr
时,我在启动#map
操作之前的arr
中获得了相同的内容。
使用inject
您通常返回一个值(通常用于数学),而使用地图则返回一个数组。