Aqui esta 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
Y aquí está 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
Pensé en usar raise, pero estoy tratando de hacerlo genérico, así que no quiero poner nada específico Foo
.
next
,break
,return
, No se puede compararnext
obreak
con un argumento.redo
, que básicamente solo mueve la ejecución de regreso a la parte superior del bloque dentro de la iteración actual.Solo quería salir de un bloque, algo así como un goto hacia adelante, no realmente relacionado con un bucle. De hecho, quiero romper un bloque que está en un bucle sin terminar el bucle. Para hacer eso, hice el bloque un ciclo de una iteración:
Espero que esto ayude al próximo googler que aterriza aquí en función de la línea de asunto.
fuente
Si desea que su bloque para devolver un valor de uso (por ejemplo, cuando se utiliza
#map
,#inject
etc.),next
ybreak
también aceptan un argumento.Considera lo siguiente:
El equivalente usando
next
:Por supuesto, siempre puede extraer la lógica necesaria en un método y llamarla desde dentro de su bloque:
fuente
break
!break
(probablemente solo reemplace uno de susnext
conbreak
..break something
funciona,break(something)
funciona perotrue && break(somehting)
produce un error de sintaxis. Solo para tu información. Si se necesita condición, entoncesif
o seunless
debe usar.use la palabra clave en
break
lugar dereturn
fuente
Quizás pueda usar los métodos incorporados para encontrar elementos particulares en una matriz, en lugar de hacer
each
-ingtargets
y hacer todo a mano. Algunos ejemplos:Un ejemplo sería hacer algo como esto:
fuente
next
¡ybreak
parece hacer lo correcto en este ejemplo simplificado!salida: 1 3 4 5 6 7 8
fuente
Para salir de un bloque de rubí, simplemente use la
return
palabra clavereturn if value.nil?
fuente
return
sale de la función?