在Ruby中将生成多个枚举的循环转换为单个惰性枚举(或枚举数?),可能使用flat_map/Flatte
我使用的gem包含以下代码,允许对web服务查询返回的每个记录调用一个块,即使该web服务查询被分页并且需要多个请求:在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
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)它懒惰吗?目前,我个人想在每条记录上运行一段代码,因此每条
都会很好地为我服务。但将来,我(或其他调用者)可能希望对转换后的集合执行任何可枚举
操作……尽管现在阅读文档,看起来几乎所有可枚举
方法都会创建数组,这对大数据来说是无用的。也许我想要的是枚举器
,而不是可枚举的
?