为了账号安全,请及时绑定邮箱和手机立即绑定

Array#each与Array#map

/ 猿问

Array#each与Array#map

FFIVE 2019-10-16 13:16:32

hash = { "d" => [11, 22], "f" => [33, 44, 55] }


# case 1

hash.map {|k,vs| vs.map {|v| "#{k}:#{v}"}}.join(",")

=> "d:11,d:22,f:33,f:44,f:55"


# case 2

hash.map {|k,vs| vs.each {|v| "#{k}:#{v}"}}.join(",")

=> "11,22,33,44,55"

唯一的区别是案例1使用vs.map,案例2使用vs.each。


这里发生了什么?


查看完整描述

3 回答

?
天天世纪

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"]


查看完整回答
反对 回复 2019-10-16
?
守着星空守着你

的副作用是它增加了一些混乱的逆向工程相同。


是的,两者都遍历数组(实际上是遍历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。


查看完整回答
反对 回复 2019-10-16
?
慕容708150

以下是有关地图与每个地图的区别的快速演示


a = ["a", "b", "c"];

#Array.map

p a.map {|item| "map_" + item}

#prints ["map_a", "map_b", "map_c"]


#Array.each

p a.each {|item| "map_" + item}

#prints ["a", "b", "c"]

您会看到map返回,["map_a", "map_b", "map_c"]而每个map 只是迭代但返回原始数组:["a", "b", "c"]。


因此,每个数组都用于处理数组,而map则用于处理数组。


查看完整回答
反对 回复 2019-10-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信