为什么Array#每个都返回一个具有相同元素的数组?

时间:2012-07-22 00:27:24

标签: ruby arrays each self

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

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

结果是一个

数组
[1,2,3,4,5]

但我不认为我完全明白为什么。为什么each的返回值是相同的数组?难道每个都不提供迭代方法吗?或者each方法返回原始值只是常见做法吗?

4 个答案:

答案 0 :(得分:24)

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

也许您的意思是使用map

p [1,2,3,4,5].map { |i| i*i }

答案 1 :(得分:3)

阵列#每个

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

阵列#地图

如果要返回 new 数组,则需要使用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,同时保持原始数据不变。

答案 2 :(得分:2)

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

它也可以返回原始对象而不是返回nil

答案 3 :(得分:1)

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

  [1,2,3,4,5].each do |nr|
    puts nr.inspect
  end;nil