블록에서 일찍 무언가를 반환하려면 어떻게해야합니까?


91

다음과 같이하고 싶다면 :

collection.each do |i|
   return nil if i == 3

   ..many lines of code here..
end

그 효과를 어떻게 얻을 수 있습니까? 큰 if 문으로 블록 내부의 모든 것을 래핑 할 수 있다는 것을 알고 있지만 가능하면 중첩을 피하고 싶습니다.

나머지 요소의 반복을 중지하고 싶지 않기 때문에 Break는 여기서 작동하지 않습니다 .

답변:


177

next블록 내부는 블록에서 반환됩니다. break블록 내부는 블록에 양보 한 함수에서 반환됩니다. 대한 each이 수단 break루프를 종료하고 next루프 (따라서 이름)의 다음 반복으로 이동합니다. next value및 로 값을 반환 할 수 있습니다 break value.


54
next value및에 대한 +1 break value. 내가 찾던 바로 그것.
Joshua Pinter 2011

1
break value나를 위해 일하지 않았지만 잘 작동 next value했습니다. 감사합니다.
Francesco Belladonna 2013 년

4
다음과 휴식에 대한 정의가 정확한지 잘 모르겠습니다. 적어도 그들은 혼란 스럽습니다. break는 가장 안쪽의 루프를 종료하고 next는 다음 반복으로 이동합니다. 출처 : tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox

3
@WattsInABox next이며 break루핑 구조에만 국한되지 않으므로 링크 한 기사는 매우 오해의 소지가 있습니다 (반대를 크게 암시하기 때문에). 그리고 내 설명은 확실히 할 때 정확 next하고 break블록 내에서 사용되는 (주 그 whilefor이제까지의 사용의 99 % 있도록 루비에 사용되는 경우는 거의 없습니다 nextbreak블록 내에있는).
sepp2k

비 루핑 블록을 의미한다고 생각합니다. 그것은 그것에 대해 혼란스러운 것입니다. 또한 나는 당신의 99 % 주장에 동의하지 않지만 그것은 다른 주장입니다.
WattsInABox

11
#!/usr/bin/ruby

collection = [1, 2, 3, 4, 5 ]

stopped_at = collection.each do |i|
   break i if i == 3

   puts "Processed #{i}"
end

puts "Stopped at and did not process #{stopped_at}"

5

이 경우 break를 사용하여 루프를 일찍 종료 할 수 있습니다.

collection.each do |i|
  break if i == 3
  ...many lines
end

... 물론, 이것은 당신이 실제로 값을 반환하려고하는 것이 아니라 단지 블록을 벗어나는 것을 가정하는 것입니다.


이것은 단지 블록에서 돌아 오는 것이 아니라 각각에서 돌아올 것입니다. 따라서 루프는 종료되고 다음 값으로 계속되지 않습니다. 그것이 의도 한 것인지 확실하지 않습니다.
sepp2k

4
당신이 값을 사용할 수 있습니다 break루비를 - break 5의 원인이됩니다 each5. 반환

1
감사합니다.하지만 반복을 멈추고 싶지 않습니다.
ryeguy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.