Oto 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
A oto 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
Myślałem o użyciu przebicia, ale staram się, aby było to ogólne, więc nie chcę dodawać nic konkretnego Foo
.
next
,break
,return
, Nie można porównaćnext
lubbreak
z argumentem.redo
, które po prostu przenosi wykonanie z powrotem na górę bloku w bieżącej iteracji.Chciałem po prostu móc wydostać się z bloku - coś w rodzaju goto do przodu, niezupełnie związanego z pętlą. W rzeczywistości chcę zerwać z bloku, który jest w pętli bez przerywania pętli. Aby to zrobić, utworzyłem blok w pętli jednoetapowej:
Mam nadzieję, że to pomoże następnemu Google'owi, który wyląduje tutaj na podstawie tematu.
źródło
Jeśli chcesz, aby powrócić do bloku użyteczną wartość (na przykład przy użyciu
#map
,#inject
etc.),next
abreak
także przyjąć argumentu.Rozważ następujące:
Odpowiednik przy użyciu
next
:Oczywiście zawsze można wyodrębnić potrzebną logikę do metody i wywołać ją z wnętrza bloku:
źródło
break
!break
(prawdopodobnie wystarczy wymienić jeden z twoichnext
zbreak
..break something
działa,break(something)
działa, aletrue && break(somehting)
powoduje błąd składniowy. Po prostu dla ciebie. Jeśli warunek jest potrzebne, toif
czyunless
należy stosować.użyj słowa kluczowego
break
zamiastreturn
źródło
Być może możesz użyć wbudowanych metod do znajdowania określonych elementów w tablicy, zamiast
each
-ingtargets
i robienia wszystkiego ręcznie. Kilka przykładów:Jednym z przykładów może być zrobienie czegoś takiego:
źródło
next
ibreak
wydaje się, że robi to poprawnie w tym uproszczonym przykładzie!wyjście: 1 3 4 5 6 7 8
źródło
Aby wyjść z rubinowego bloku, wystarczy użyć
return
słowa kluczowegoreturn if value.nil?
źródło
return
wychodzi z funkcji?