我有一个枚举器,它循环来自外部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
被调用?这有什么好的模式吗?
答案 0 :(得分:0)
您只需使用参数调用break
:
api_enum.each do |thing|
do_stuff(thing)
break(notify_api_that_i_am_done)
end
答案 1 :(得分:0)
在api_enum
方法中,您可以使用ensure
始终执行清理代码,无论是否抛出任何异常或用户break
。这对于任何清理代码都是一个好主意,因为只有这样,即使在用户提供的块中引发异常,你也可以确保它运行。
可以这样使用:
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
使用该模式,您无需遵循任何特殊的呼叫约定。