Ruby中的每个和collect方法之间有什么不同

mko*_*mko 62 ruby each collect

从这段代码我不知道两种方法之间的区别,collecteach.

a = ["L","Z","J"].collect{|x| puts x.succ} #=> M AA K 
print  a.class  #=> Array

b = ["L","Z","J"].each{|x| puts x.succ} #=> M AA K
print  b.class #=> Array
Run Code Online (Sandbox Code Playgroud)

Ram*_*Vel 108

Array#each获取一个数组并将给定的块应用于所有项目.它不会影响数组或创建新对象.它只是循环项目的一种方式.它也回归自我.

  arr=[1,2,3,4]
  arr.each {|x| puts x*2}
Run Code Online (Sandbox Code Playgroud)

打印2,4,6,8并返回[1,2,3,4]无论如何

Array#collectArray#map与它相同并且它在所有项上应用给定的代码块并返回新数组.简单地将'将一个序列的每个元素投影到一个新形式'

  arr.collect {|x| x*2}
Run Code Online (Sandbox Code Playgroud)

退货[2,4,6,8]

在你的代码中

 a = ["L","Z","J"].collect{|x| puts x.succ} #=> M AA K 
Run Code Online (Sandbox Code Playgroud)

a是一个数组,但它实际上是一个Nil的数组[nil,nil,nil]因为puts x.succ返回nil(即使它打印的是M AA K).

 b = ["L","Z","J"].each{|x| puts x.succ} #=> M AA K
Run Code Online (Sandbox Code Playgroud)

也是一个数组.但它的值是["L","Z","J"],因为它返回自我.


Tom*_*Tom 38

Array#each只需获取每个元素并将其放入块中,然后返回原始数组.Array#collect获取每个元素并将其放入一个返回的新数组中:

[1, 2, 3].each { |x| x + 1 }    #=> [1, 2, 3]
[1, 2, 3].collect { |x| x + 1 } #=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)


Mat*_*ggs 5

each当你想迭代一个数组,并在每次迭代中做任何你想做的事情时.在大多数(命令性)语言中,这是程序员在您需要处理列表时所达到的"一刀切"的锤子.

对于更多功能语言,如果您不能以任何其他方式执行此操作,则只执行此类通用迭代.大多数情况下,map或reduce更合适(收集并注入红宝石)

collect 是想要将一个数组转换为另一个数组的时候

inject 用于何时将数组转换为单个值