在Ruby中将生成多个枚举的循环转换为单个惰性枚举(或枚举数?),可能使用flat_map/Flatte

在Ruby中将生成多个枚举的循环转换为单个惰性枚举(或枚举数?),可能使用flat_map/Flatte,ruby,yield,enumerable,flatten,Ruby,Yield,Enumerable,Flatten,我使用的gem包含以下代码,允许对web服务查询返回的每个记录调用一个块,即使该web服务查询被分页并且需要多个请求: def each(&block) yield_from_response &block while resumable? @response = @resumption_block.call @response yield_from_response &block end end privat

我使用的gem包含以下代码,允许对web服务查询返回的每个记录调用一个块,即使该web服务查询被分页并且需要多个请求:

  def each(&block)
    yield_from_response &block
    while resumable?
      @response = @resumption_block.call @response
      yield_from_response &block
    end
  end

  private

  def yield_from_response(&block)
    @response.each do |obj|
      block.call(obj)
    end
  end

  def resumable?
    @response.resumption_token and not @response.resumption_token.empty?
  end
(对于这个问题,细节不是很重要,但对于那些关心的人来说,gem是重要的,而相关的代码是重要的。)

我试图将
each()
包装在一个方法中,该方法返回响应中每个对象周围的
可枚举的包装对象。如果我不关心恢复,我可以避免上面的代码,直接访问响应(这是一个
可枚举的
):

response ? response.map { |obj| MyGem::MyWrapper.new(obj) } : []
现在,我很容易通过那个街区:

response ? response.full.each { |obj| MyGem::MyWrapper.new(obj) } : []
# full() provides the resumable wrapper with each() and yield_from_response()
但是在恢复的情况下,由于
每个
都不会返回任何有用的内容,因此无法获得结果

结果集可能非常大(比物理RAM大),因此我不想将所有内容都显式或隐式地转储到临时数组中

显然,我需要的是编写自己的
each()
替代方法,即不使用块,只返回嵌入
@响应中的所有
对象的
可枚举的
。我觉得应该有一种简单的方法来实现这一点,而不必编写一个完整的
可枚举的
实现,但我对Ruby还不够了解,不清楚它是什么

我能想到的最好的办法是以下,这也是不正确的:

  def to_enumerable(response)
    response.each { |obj| yield MyGem::MyWrapper.new(obj) }
    resumption_block = response.resumption_block
    if resumption_block
      while response.resumption_token && !response.resumption_token.empty?
        response = resumption_block.call response
        response.each { |obj| yield MyGem::MyWrapper.new(obj) }
      end
    end
  end
这是不正确的,因为Ruby的
yield
并不是真正的“yield”,它只是调用一个块,如果我想传入一个块,我可以调用原始的
each()

如果我能弄清楚如何将重复分配到
响应
的任务转换为一系列
响应
,我可以使用
平面图
,但我不确定如何做到这一点



ETA:仔细检查,它看起来像是可枚举的
Enumerable
并不是懒惰的,如果我想避免创建数组(从而使大型数据集的内存不足),我可能实际上需要
枚举器。如果我理解正确。

如果你不想要一个带有结果的数组,你想对每个单独的结果做什么?和
response.full.to_enum
是否已经有了一个来自itOkay的枚举器,我看到
to_enum
可以工作,但是(1)它在哪里/如何实现,(2)是什么告诉我它在那里,(3)它懒惰吗?目前,我个人想在每条记录上运行一段代码,因此
每条
都会很好地为我服务。但将来,我(或其他调用者)可能希望对转换后的集合执行任何
可枚举
操作……尽管现在阅读文档,看起来几乎所有
可枚举
方法都会创建数组,这对大数据来说是无用的。也许我想要的是
枚举器
,而不是
可枚举的