什么';在Ruby中,每个和collect方法都不同

什么';在Ruby中,每个和collect方法都不同,ruby,each,collect,Ruby,Each,Collect,从这段代码中,我不知道两种方法之间的区别,collect和each 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 Array#each只需获取每个元素并将其放入块中,然后返回原始数组Array#colle

从这段代码中,我不知道两种方法之间的区别,
collect
each

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
Array#each
只需获取每个元素并将其放入块中,然后返回原始数组
Array#collect
获取每个元素并将其放入一个新数组中,该数组返回:

[1, 2, 3].each { |x| x + 1 }    #=> [1, 2, 3]
[1, 2, 3].collect { |x| x + 1 } #=> [2, 3, 4]

区别在于它的回报。在你上面的例子中
a==[nil,nil,nil]
(put x.succ的值),而
b==[“L”,“Z”,“J”]
(原始数组)

在ruby文档中,collect执行以下操作:

为的每个元素调用一次块 自己创建一个包含 块返回的值


每个始终返回原始数组。有意义吗?

根据

值
rb_ary_每个(值ary)
{
龙我;
返回枚举数(ary,0,0);

for(i=0;i
每一个
都是为了在一个数组上进行迭代,并在每次迭代中做任何你想做的事情。在大多数(命令式)语言中,这是程序员在需要处理列表时使用的“一刀切”的锤子

对于更多的函数式语言,只有在不能用其他方法进行这种泛型迭代的情况下,才可以进行这种迭代。大多数情况下,map或reduce更合适(在ruby中收集和注入)

collect
用于将一个数组转换为另一个数组

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

数组#每个
接受一个数组并将给定的块应用于所有项。它不会影响数组或创建新对象。它只是在项上循环的一种方式。它还返回self

  arr=[1,2,3,4]
  arr.each {|x| puts x*2}
打印2,4,6,8并返回[1,2,3,4],无论发生什么情况

Array#collect
Array#map
相同,它将给定的代码块应用于所有项目并返回新数组。只需将'将序列中的每个元素投影到新形式中即可。

  arr.collect {|x| x*2}
返回[2,4,6,8]

在你的代码里

 a = ["L","Z","J"].collect{|x| puts x.succ} #=> M AA K 
a是一个数组,但实际上它是一个Nil的数组[Nil,Nil,Nil],因为
放置x.such
返回
Nil
(即使它打印M AA K)


也是一个数组。但是它的值是[“L”,“Z”,“J”],因为它返回self。

每个都是由包含可枚举模块的所有类定义的方法。
对象。每个
返回一个
可枚举::枚举器
对象。这是其他可枚举方法用于迭代对象的方法。
每个类的每个
方法的行为不同

  arr=[1,2,3,4]
  arr.each {|x| puts x*2}

在数组类中,当一个块被传递到
每个
时,它在每个元素上执行该块的语句,但最终返回self。当您不需要数组,但您可能只想从数组中选择元素并将其用作其他方法的参数时,这很有用。
检查
映射
返回一个新的数组y,返回每个元素上执行块的值。您可以使用
map!
collect!
对原始数组执行操作。

我认为更容易理解的方法如下:

nums = [1, 1, 2, 3, 5]
square = nums.each { |num| num ** 2 } # => [1, 1, 2, 3, 5]
相反,如果您使用collect:

square = nums.collect { |num| num ** 2 } # => [1, 1, 4, 9, 25]

另外,您还可以使用
.collect!
对原始数组进行变异。

为什么要
打印
ing
a.class
b.class
?打印
a
b
,这一点会很清楚。请参阅重构的答案。我认为您混淆了两个相同的单行程序的效果和返回它们的值不同。要查看对象的内容,请使用
p
而不是
print
。我忘了提到这一点。请在上面的代码中尝试
pa
pb
square = nums.collect { |num| num ** 2 } # => [1, 1, 4, 9, 25]