2017-09-14 83 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 

與該模式,你不需要遵循任何特殊的調用約定。