Answers:
Array#each
为数组的每个元素执行给定的块,然后返回数组本身。
Array#map
也为数组的每个元素执行给定的块,但是返回一个新数组,其值是该块每次迭代的返回值。
示例:假设您已经定义了一个数组:
arr = ["tokyo", "london", "rio"]
然后尝试执行each
:
arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]
注意,返回值只是同一数组。each
块中的代码将被执行,但不会返回计算出的值;并且由于代码没有副作用,因此该示例没有做任何有用的工作。
相反,调用数组的map
方法将返回一个新数组,其元素是执行该map
块的每一轮的返回值:
arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]
的副作用是它增加了一些混乱的逆向工程相同。
是的,两者都遍历数组(实际上是遍历Enumerable中混合的任何内容),但是map将返回由块结果组成的Array,而每个都将返回原始Array。
每个函数的返回值只是原始数组,很少在Ruby代码中使用,但是map是最重要的功能工具之一。
是什么map
做的是返回包含传递块或命名方法的结果的数组。例如:
2.2.3 :001 > [:how, :now, :brown, :cow].map &:to_s
=> ["how", "now", "brown", "cow"]
在这种情况下,我没有传递一个块,而只是传递了一个Symbol
,但是class Symbol
对象具有to_proc
将导致以下结果的方法:
[:how.to_s, :now.to_s, ...]
顺便说一句,您可能很难找到文档,因为map是Enumerable中的一个方法,而每个(Enumerable模块所需的一个方法)都是Array中的一个方法。
请注意:地图实现基于each。
Array#each方法返回相同的数组
a = [1,2,3,4,5]
a.object_id #70284994490700
b = a.each {|n| n + 2}
p b #[1,2,3,4,5]
b.object_id #70284994490700 <<--- it's the same as a
Array#map方法返回一个新数组
c = [1,2,3,4,5]
c.object_id #70219117705860
d = c.map {|n| n + 2}
p d #[3,4,5,6,7]
d.object_id #70284994343620 <<---- it's different than c
您也可以使用map
bang map!
更改源数组
each
,后者执行给定的块并返回原始数组;和map
,它返回一个数组,其中将执行该块的结果作为值