23

我正在学习如何each在 ruby​​ 中工作的详细信息,并尝试了以下代码行:

p [1,2,3,4,5].each { |element| el }

结果是一个数组

[1,2,3,4,5]

但我不认为我完全理解为什么。为什么返回值是each同一个数组?不都只是提供了一种迭代的方法吗?还是该each方法返回原始值只是常见的做法?

4

4 回答 4

27

Array#each返回调用它的 [array] 对象:块的结果被丢弃。因此,如果原始数组没有不良副作用,那么什么都不会改变。

也许你的意思是使用map

p [1,2,3,4,5].map { |i| i*i }
于 2012-07-22T00:35:11.700 回答
4

数组#每个

Array#each的块形式返回原始的 Array 对象。当您想对块内数组的每个元素执行某些操作时,通常使用#each。例如:

[1, 2, 3, 4, 5].each { |element| puts element }

这将打印出每个元素,但返回原始数组。您可以通过以下方式验证这一点:

array = [1, 2, 3, 4, 5]
array.each { |element| element }.object_id === array.object_id
=> true

数组#map

如果要返回一个数组,则需要使用Array#map或其同义词之一。#map 的块形式返回不同的 Array 对象。例如:

array.object_id
=> 25659920
array.map { |element| element }.object_id
=> 20546920
array.map { |element| element }.object_id === array.object_id
=> false

当您想要对原始数组的修改版本进行操作时,您通常需要使用#map,同时保持原始数组不变。

于 2012-07-22T00:50:27.487 回答
3

所有方法都返回一些东西。即使它只是一个nil对象,它也会返回一些东西。

它还不如返回原始对象而不是 return nil

于 2012-07-23T23:13:56.073 回答
3

如果您出于某种原因想要抑制输出(例如在控制台中调试),您可以通过以下方式实现

  [1,2,3,4,5].each do |nr|
    puts nr.inspect
  end;nil
于 2018-11-21T09:08:21.517 回答