2017-09-14 4 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 방법, 당신이 던져지는 예외 또는 사용자 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 

, 당신은 특별한 호출 규칙을 따라야 할 필요가 없습니다.

관련 문제