Ini adalah Bar#do_things
:
class Bar
def do_things
Foo.some_method(x) do |x|
y = x.do_something
return y_is_bad if y.bad? # how do i tell it to stop and return do_things?
y.do_something_else
end
keep_doing_more_things
end
end
Dan di sini adalah Foo#some_method
:
class Foo
def self.some_method(targets, &block)
targets.each do |target|
begin
r = yield(target)
rescue
failed << target
end
end
end
end
Saya berpikir tentang menggunakan kenaikan gaji, tetapi saya mencoba membuatnya generik, jadi saya tidak ingin memasukkan sesuatu yang spesifik Foo
.
next
,break
,return
, Anda tidak bisa membandingkannext
ataubreak
dengan argumen.redo
, yang pada dasarnya hanya memindahkan eksekusi kembali ke atas blok dalam iterasi saat ini.Saya hanya ingin bisa keluar dari blok - semacam goto ke depan, tidak benar-benar terkait dengan loop. Bahkan, saya ingin memecah blok yang ada dalam satu lingkaran tanpa mengakhiri loop. Untuk melakukan itu, saya membuat blok loop satu iterasi:
Semoga ini bisa membantu googler berikutnya yang mendarat di sini berdasarkan baris subjek.
sumber
Jika Anda ingin blok Anda untuk mengembalikan nilai yang berguna (misalnya saat menggunakan
#map
,#inject
, dll),next
danbreak
juga menerima argumen.Pertimbangkan yang berikut ini:
Setara menggunakan
next
:Tentu saja, Anda selalu dapat mengekstrak logika yang diperlukan ke dalam metode dan menyebutnya dari dalam blok Anda:
sumber
break
!break
(mungkin hanya mengganti salah satu dari Andanext
denganbreak
..break something
berfungsi,break(something)
bekerja tetapitrue && break(somehting)
menghasilkan kesalahan sintaksis. Hanya FYI. Jika kondisi diperlukan, makaif
atauunless
perlu digunakan.gunakan kata kunci
break
alih-alihreturn
sumber
Mungkin Anda dapat menggunakan built-in metode untuk menemukan item tertentu dalam Array, bukan
each
-ingtargets
dan melakukan segala sesuatu dengan tangan. Beberapa contoh:Salah satu contoh akan melakukan sesuatu seperti ini:
sumber
next
danbreak
tampaknya melakukan hal yang benar dalam contoh sederhana ini!output: 1 3 4 5 6 7 8
sumber
Untuk keluar dari blok ruby cukup gunakan
return
kata kuncireturn if value.nil?
sumber
return
keluar dari fungsi?