Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 redo, retry 및 다음 키워드

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 주제가 있으면 주저하지 말고 알려주세요.