2017-09-14 32 views
0

我有一个循环来自外部API的数据的枚举器。 API请求在完成循环时通知它。当统计员被允许去数据时,这很容易:如何在Ruby中“关闭”枚举器?

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

“break notify_api_that_i_am_done”有什么问题? – spickermann

+0

@spickermann我真的不知道那是一件事。 – abeger

回答

0

您只需拨打break与参数:

api_enum.each do |thing| 
    do_stuff(thing) 
    break(notify_api_that_i_am_done) 
end 
0

在你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 

与该模式,你不需要遵循任何特殊的调用约定。