Ruby 枚举是不是有 `with_self` 或类似的块?

Posted

技术标签:

【中文标题】Ruby 枚举是不是有 `with_self` 或类似的块?【英文标题】: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 都不是底层数组。该块在每行输入之后立即运行,因此不存在保存每一行输入的数组,因为该数组必须保存尚未提供给程序的输入。 【参考方案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,但因为它关闭了一个枚举器,所以播放效果不佳。我试图删减细节以使其更广泛并对其他人有所帮助,但我将编辑原始帖子以更具体。

以上是关于Ruby 枚举是不是有 `with_self` 或类似的块?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中“关闭”枚举器?

Ruby - 优雅地比较两个枚举器

如何在 ruby​​ 中批处理枚举

php 是不是有相当于 python 的 virtualenv 或 ruby​​ 的沙箱?

如何检查变量是不是是 Ruby 中的日期或时间或日期时间?

从Ruby中编译的protobuf消息中获取枚举值