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

私はnotify_api_that_i_am_doneを呼び出すするつもりはありませんよbreak手段。 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方法では、あなたがスローされるすべての例外またはユーザーbreak INGに関係なく、常にクリーンアップコードを実行するためにensureを使用することができます。これは、クリーンアップコードに使用することをお勧めします。なぜなら、ユーザーが提供するブロックで何か例外が発生したとしても、それを確実に実行できるようになるからです。

これは、このように使用することができます。そのパターンで

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 

、何か特別な呼び出し規約に従う必要はありません。

関連する問題