Bir şeyi bloktan erken nasıl iade edebilirim?


91

Böyle bir şey yapmak isteseydim:

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

   ..many lines of code here..
end

Bu etkiyi nasıl elde ederim? Blok içindeki her şeyi büyük bir if ifadesiyle sarabileceğimi biliyorum, ancak mümkünse iç içe geçmeyi önlemek istiyorum.

Ben çünkü Molası, burada işe yaramaz değil kalan elemanlarının yinelemesini durdurmak istiyoruz.

Yanıtlar:


177

nextbir bloğun içinde bloktan döner. breakbir blok içinde, bloğa verilen fonksiyondan geri döner. İçin eachbu aracı breakdöngü çıkar ve nextdöngü (böylece isimler) sonraki yinelemeye atlar. Değerleri next valueve ile döndürebilirsiniz break value.


54
+1 next valueve break value. Tam olarak aradığım şey.
Joshua Pinter

1
break valuebenim için next valueçalışmadı, iyi çalıştı. Çok teşekkürler.
Francesco Belladonna

4
Sonraki ve kırılma tanımınızın doğru olduğundan emin değilim. En azından kafa karıştırıyorlar. break, en içteki döngüden çıkar, sonra sizi bir sonraki yinelemeye taşır. kaynak: tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox

3
@WattsInABox nextve breakhiçbir şekilde döngüsel yapılara özgü değildir, bu nedenle bağladığınız makale çok yanıltıcıdır (çünkü büyük ölçüde tersini ima eder). Ve benim açıklamaları kesinlikle zaman doğru nextve breakblokların içine kullanılmaktadır (not olduğunu whileve forşimdiye kadar, kullanımlarının% 99 bu yüzden Ruby kullanılırsa, nadiren nextve breakblok içinde).
sepp2k

Döngüsüz blokları kastettiğini düşünüyorum. Kafasını karıştıran şey bu. Ayrıca,% 99 iddianıza katılmıyorum, ancak bu farklı bir argüman.
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

Bu durumda, döngüyü erken sonlandırmak için break kullanabilirsiniz:

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

... tabii ki, bu aslında bir değer döndürmek istemediğinizi varsaymaktır, sadece bloktan çıkın.


Bu sadece bloktan dönmekle kalmaz, her birinden geri döner. Böylece döngü bir sonraki değerle devam etmez, biter. Bunun amaçlandığından emin değilim.
eylül

4
breakRuby'de bir değer kullanabilirsiniz - 5 döndürmeye break 5neden eacholur.
Chuck

1
Teşekkürler ama yinelemeyi durdurmak istemiyorum.
ryeguy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.