不能用`map`替换'each`的全部或大多数情况?

saw*_*awa 5 ruby each map

Enumerable#each和之间的区别在于Enumerable#map它是返回接收器还是映射结果.再回到接收器是微不足道的,你通常不需要继续后一种方法链each一样each{...}.another_method(我可能从来没有见过这样的情况下,即使你想回接收器,你可以做到这一点tap).所以我认为使用的所有或大多数情况Enumerable#each都可以替换为Enumerable#map.我错了吗?如果我是对的,目的是each什么?是map慢each?

编辑:我知道each当你对返回值不感兴趣时,有一种常见的做法.我对这种做法是否存在并不感兴趣,但我对这种做法是否有意义感兴趣,而不是从惯例的角度来看.

Way*_*rad 6

map和之间的区别each比一个返回一个新数组而另一个没有返回更重要.重要的区别在于他们如何传达您的意图.

当你使用时each,你的代码说"我正在为每个元素做点什么." 当你使用时map,你的代码说"我正在通过转换每个元素来创建一个新的数组."

因此,虽然你可以使用map代替each,尽管性能,代码现在会对任何人阅读它的意图撒谎.


ste*_*lag 5

选择map或each应由所需的最终结果决定:新阵列还是没有新阵列.结果map 可能是巨大的和/或愚蠢的:

p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's
Run Code Online (Sandbox Code Playgroud)

  • 它也是语义学.读你的代码的另一个人可能会怀疑*为什么*你决定使用`map`,以及你使用它的目标是什么,什么时候没有. (4认同)
  • 这个`map`的结果是一个456976 nil的数组(`puts`返回nil).它在创建后被丢弃.使用`each`根本不会创建它,节省内存.(代码略有调整) (3认同)