Hier ist 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
Und hier ist 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
Ich habe darüber nachgedacht, Raise zu verwenden, aber ich versuche, es generisch zu machen, also möchte ich nichts Spezielles hinzufügen Foo
.
next
,break
,return
Kann man nicht vergleichennext
oderbreak
mit einem Argument erweitert.redo
, das die Ausführung innerhalb der aktuellen Iteration einfach wieder an den Anfang des Blocks verschiebt.Ich wollte nur in der Lage sein, aus einem Block auszubrechen - eine Art Vorwärts-Goto, der nicht wirklich mit einer Schleife zusammenhängt. Tatsächlich möchte ich einen Block, der sich in einer Schleife befindet, abbrechen, ohne die Schleife zu beenden. Zu diesem Zweck habe ich den Block zu einer Schleife mit einer Iteration gemacht:
Hoffe das hilft dem nächsten Googler, der hier landet, basierend auf der Betreffzeile.
quelle
Wenn Sie Ihr Block einen nützlichen Wert zurückgeben (zB bei der Verwendung
#map
,#inject
etc.),next
undbreak
auch ein Argument akzeptieren.Folgendes berücksichtigen:
Das Äquivalent mit
next
:Natürlich können Sie jederzeit die erforderliche Logik in eine Methode extrahieren und diese aus Ihrem Block heraus aufrufen:
quelle
break
!break
(wahrscheinlich ersetzen Sie einfach eines Ihrernext
durchbreak
..break something
funktioniert,break(something)
funktioniert,true && break(somehting)
ergibt aber einen Syntaxfehler. Nur zu deiner Information. Wenn eine Bedingung erforderlich ist, mussif
oderunless
muss diese verwendet werden.Verwenden Sie das Schlüsselwort
break
anstelle vonreturn
quelle
Vielleicht können Sie die integrierten Methoden verwenden, um bestimmte Elemente in einem Array zu finden, anstatt alles von Hand zu
each
erledigentargets
. Einige Beispiele:Ein Beispiel wäre so etwas:
quelle
next
undbreak
scheinen in diesem vereinfachten Beispiel das Richtige zu tun!Ausgabe: 1 3 4 5 6 7 8
quelle
Um aus einem Rubinblock auszubrechen, verwenden Sie einfach das
return
Schlüsselwortreturn if value.nil?
quelle
return
die Funktion nicht?