如何在 Ruby 中“关闭”枚举器?
Posted
技术标签:
【中文标题】如何在 Ruby 中“关闭”枚举器?【英文标题】:How can I "close" an enumerator in Ruby? 【发布时间】:2018-02-23 15:32:54 【问题描述】:我有一个循环访问来自外部 API 的数据的枚举器。当我完成循环时,API 请求我通知它。当枚举器被允许去直到它用完数据时,这很容易:
def api_enum
return enum_for(:api_enum) unless block_given?
loop_on_api_calls |thing| yield thing
notify_api_that_i_am_done
end
但是这个案子呢?
api_enum.each do |thing|
do_stuff(thing)
break
end
break
表示我永远不会打电话给notify_api_that_i_am_done
。我如何构建它以保证notify_api_that_i_am_done
被调用?这有什么好的模式吗?
【问题讨论】:
break notify_api_that_i_am_done
有什么问题?
@spickermann 老实说,我不知道那是一回事。
【参考方案1】:
你可以只用参数调用break
:
api_enum.each do |thing|
do_stuff(thing)
break(notify_api_that_i_am_done)
end
【讨论】:
【参考方案2】:在您的api_enum
方法中,您可以使用ensure
始终执行清理代码,而不管抛出任何异常或用户break
ing。这对于任何清理代码都是一个好主意,因为只有这样才能确保我们运行它,即使在用户提供的块中引发了异常。
可以这样使用:
def api_enum
return enum_for(:api_enum) unless block_given?
loop_on_api_calls |thing| yield thing
ensure
notify_api_that_i_am_done
end
使用该模式,您无需遵循任何特殊的调用约定。
【讨论】:
以上是关于如何在 Ruby 中“关闭”枚举器?的主要内容,如果未能解决你的问题,请参考以下文章