retry
에 대해 이야기했습니다. 예외 후 재시도를 논의하는 동안 키워드. 잘 알려지지 않은 redo
비슷하게 작동하지만 전체 블록 대신 루프 반복을 다시 실행합니다.
redo
키워드
이전 아카데미 기사에서 배웠듯이 retry
하세요. 블록에서 코드 조각을 다시 시도할 수 있습니다.
begin
puts "Iteration"
raise
rescue
retry
end
이 예제는 예외를 발생시키기 전에 "반복"이라는 단어를 콘솔에 출력합니다. retry
를 호출하는 구조 블록이 실행됩니다. 블록을 처음부터 다시 시작합니다. 결과적으로 우리 프로그램은 Iteration
을 끝없이 인쇄합니다. . redo
키워드를 사용하면 루프를 사용할 때 비슷한 효과를 얻을 수 있습니다. 이는 예를 들어 반복하는 동안 다시 시도해야 하는 상황에서 유용합니다.
10.times do |i|
puts "Iteration #{i}"
redo if i > 2
end
다음과 같이 인쇄됩니다.
$ ruby redo.rb
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 3
Iteration 3
...
반복 횟수가 어떻게 동일하게 유지되는지 알 수 있습니까? 루프의 시작 부분으로 실행을 되돌립니다. retry
를 사용하는 이 코드 변형 정확히 동일한 출력을 인쇄합니다:
10.times do |i|
begin
puts "Iteration #{i}"
raise if i > 2
rescue
retry
end
end
redo
을 사용할 수 있습니다. 루프에서 재시도를 구현합니다. 다음 예에는 작업 대기열이 있습니다. :success
를 반환합니다. 또는 :failure
. 작업이 성공할 때까지 루프의 동일한 반복을 계속 반복합니다.
[job_1, job_2, job_3, job_4].each do |job|
redo unless job.call == :success
end
루비 1.8
retry
의 동작 및 redo
Ruby 1.8과 1.9 사이에서 변경되었습니다. 루프의 반복을 다시 시작하는 데 사용되었지만 둘 다 다른 방식입니다. 1.9부터 retry
begin
에서만 작동합니다. /rescue
차단 및 redo
루프 내에서만 작동합니다.
next
키워드
루프의 다음 반복으로 이동하려는 경우 현재 루프의 시작 부분으로 다시 이동하는 것과 반대로 next
를 사용할 수 있습니다. .
10.times do |i|
puts "Iteration #{i}"
next if i > 2
puts "Iteration done"
end
다음과 같이 인쇄됩니다.
$ ruby next.rb
Iteration 0
Iteration done
Iteration 1
Iteration done
Iteration 2
Iteration done
Iteration 3
Iteration 4
...
반복 카운터가 어떻게 계속 증가하는지 확인하시겠습니까? 대부분의 경우 next
사용 당신이 원하는 것입니다. redo
살펴보기 정확한 횟수만큼 실행되는 루프가 필요하거나 배열을 반복할 때 오류 처리가 필요한 경우.
루프에서 반복을 다시 수행하는 것에 대해 새로운 것을 배웠기를 바라며 이 기사(또는 AppSignal Academy 시리즈의 다른 기사)에 대해 어떻게 생각하는지 알고 싶습니다. 여러분의 생각이나 더 알고 싶은 Ruby 주제가 있으면 주저하지 말고 알려주세요.