【问题标题】:Is there a `with_self` or similar block for a Ruby enum?Ruby 枚举是否有 `with_self` 或类似的块?
【发布时间】:2022-01-22 08:06:23
【问题描述】:

类似于在 Ruby 中你可以做的事情

[1, 2, 3].each.with_index { |num, index| }

我想链接它来添加对顶级数组的引用,而不必在块之前将所述数组分配给不同的变量,如下所示:

[1, 2, 3].each.with_index.with_self { |num, index, array| }

是否存在这样的方法,或者除了拥有顶级变量集之外的任何替代方法?

我的具体案例是一个 Ruby 脚本,我想尽可能多地打高尔夫球。 我有一个带行的输入文件,我正在读取文件,如下所示:

STDIN.each_line.with_index

但也需要反向引用原来的“数组”,但是因为each_line数组变成了一个枚举器。当然,我可以将其分解并解析,但要尽量保持脚本简洁。 with_self 将是完美的,但它似乎不存在。 ????

【问题讨论】:

  • “任何替代品” - 也许,但为了什么?为什么首先需要块内的数组引用?您要解决的具体问题是什么?
  • 当您执行STDIN.each_line.with_index {...} 时,我认为甚至 is 都不是底层数组。该块在每行输入之后立即运行,因此不存在保存每一行输入的数组,因为该数组必须保存尚未提供给程序的输入。

标签: ruby


【解决方案1】:

你可以这样做。

module Enumerable
  def with_self
    arr = to_a.map(&:first)
    loop { yield [*self.next, arr] }
  end
end
[1, 2, 3].each.with_index.with_self { |n,i,arr| puts [n,i,arr] }
  #=> [1, 0, [1, 2, 3]]
  #   [2, 1, [1, 2, 3]]
  #   [3, 2, [1, 2, 3]]

【讨论】:

  • 这很整洁,而且是一件非常酷的事情!但是,这成为高尔夫/简洁性的问题。
  • 是的,但这不是Code Golf。您的问题非常具体:您问是否有一种方法 with_self 可以满足您的要求。这是我已经回答的问题。
【解决方案2】:

您正在寻找Object#tap:

[1, 2, 3].tap { |a| a.each_with_index { |num, index| ... }

从枚举器到数组:

STDIN.each_line.to_a

或者只是

STDIN.readlines

最后:如果each_with_index 之后出现with_self,您对with_self 的想法将不起作用,因为self 将成为另一个枚举器,而不是您正在寻找的数组。

编辑:查看 Cary 的回答,了解如何让 Ruby 随心所欲。 :-)

【讨论】:

  • 正在查看tap,但因为它关闭了一个枚举器,所以播放效果不佳。我试图删减细节以使其更广泛并对其他人有所帮助,但我将编辑原始帖子以更具体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多