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` 或类似的块?的主要内容,如果未能解决你的问题,请参考以下文章