Bagaimana cara mengembalikan sesuatu lebih awal dari satu blok?

91

Jika saya ingin melakukan sesuatu seperti ini:

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

   ..many lines of code here..
end

Bagaimana saya mendapatkan efek itu? Saya tahu saya bisa membungkus semuanya di dalam blok dengan pernyataan if yang besar, tetapi saya ingin menghindari bersarang jika memungkinkan.

Istirahat tidak akan berfungsi di sini, karena saya tidak ingin menghentikan iterasi elemen yang tersisa.

ryeguy
sumber

Jawaban:

177

nextdi dalam blok kembali dari blok. breakdi dalam blok kembali dari fungsi yang dihasilkan ke blok. Untuk eachini berarti bahwa breakkeluar dari loop dan nextmelompat ke iterasi berikutnya dari loop (dengan demikian nama). Anda dapat mengembalikan nilai dengan next valuedan break value.

sepp2k.dll
sumber
54
1 untuk next valuedan break value. Persis apa yang saya cari.
Joshua Pinter
1
break valuetidak bekerja untuk saya, sementara next valuebekerja dengan baik. Terima kasih banyak.
Francesco Belladonna
4
Saya tidak yakin definisi Anda tentang next dan break sudah benar. Paling tidak, mereka membingungkan. break keluar dari loop terdalam, selanjutnya memindahkan Anda ke iterasi berikutnya. sumber: tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox
3
@WattsInABox nextdan breaksama sekali tidak spesifik untuk perulangan konstruksi, jadi artikel yang Anda tautkan sangat menyesatkan (karena sangat menyiratkan sebaliknya). Dan uraian saya pasti benar ketika nextdan breakdigunakan di dalam blok (perhatikan bahwa whiledan forjarang, jika pernah, digunakan di Ruby jadi 99% penggunaan nextdan breakberada di dalam blok).
sepp2k
Saya pikir yang Anda maksud adalah blok non-looping. Itulah yang membingungkan tentang itu. Juga, saya tidak setuju dengan 99% pernyataan Anda, tapi itu argumen yang berbeda.
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}"
JD.
sumber
5

Dalam contoh ini, Anda dapat menggunakan break untuk menghentikan loop lebih awal:

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

... tentu saja, ini mengasumsikan bahwa Anda tidak benar-benar ingin mengembalikan nilai, hanya keluar dari blok.

Sniggerfardimungus
sumber
Ini tidak akan hanya kembali dari blok, itu akan kembali dari masing-masing. Jadi pengulangan akan berakhir, bukan melanjutkan dengan nilai berikutnya. Tidak yakin itu yang dimaksudkan.
sepp2k
4
Anda dapat menggunakan nilai dengan breakdi Ruby - break 5akan menyebabkan eachpengembalian 5.
Chuck
1
Terima kasih, tapi saya tidak ingin menghentikan iterasi.
ryeguy