【问题标题】:Why does Array#each return an array with the same elements?为什么 Array#each 返回具有相同元素的数组?
【发布时间】:2012-07-20 18:21:31
【问题描述】:

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

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

结果是一个数组

[1,2,3,4,5]

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

【问题讨论】:

  • ruby API 文档说 each {|item| block } → ary 所以是的 each{block} Array 类的方法返回 self
  • 原因更多是为了方便。 Ruby 返回原始数组基本上是一个“免费”操作(否则它将返回nil)。作为奖励,它允许您根据需要链接方法以进一步对数组进行操作。
  • 一个小点:如果不存在块,[1,2,3].each 返回 [1,2,3].to_enum(至少在 Ruby 2.0 中)。

标签: ruby arrays each self


【解决方案1】:

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

也许您的意思是使用map

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

【讨论】:

  • 我没有尝试使用 map,只是想知道为什么返回值是同一个数组。但是您已经确认它只是返回相同的对象
【解决方案2】:

数组#each

Array#each 的块形式返回原始的 Array 对象。当你想对块内数组的每个元素一些事情时,你通常使用#each。例如:

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

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

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

数组#map

如果你想返回一个 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,同时保持原始数组不变。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 对,我只是希望它是 Nil,尽管我应该更仔细地阅读文档。
    【解决方案4】:

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

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

    【讨论】:

    • OMG end;nil 是我一生都在寻找的东西!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2013-06-16
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多