Aqui está 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
E aqui 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
Pensei em usar raise, mas estou tentando torná-lo genérico, então não quero colocar nada específico Foo
.
next
,break
,return
, Você não pode compararnext
oubreak
com um argumento.redo
, que basicamente apenas move a execução de volta ao topo do bloco na iteração atual.Eu queria apenas ser capaz de sair de um bloco - como se fosse um avanço para a frente, não muito relacionado a um loop. Na verdade, eu quero interromper um bloco que está em um loop sem terminar o loop. Para fazer isso, fiz do bloco um loop de uma iteração:
Espero que isso ajude o próximo pesquisador que chegar aqui com base na linha de assunto.
fonte
Se você quiser que o seu bloco para retornar um valor útil (por exemplo, quando se usa
#map
,#inject
etc.),next
ebreak
também aceitar um argumento.Considere o seguinte:
O equivalente usando
next
:Obviamente, você sempre pode extrair a lógica necessária em um método e chamar isso de dentro do seu bloco:
fonte
break
!break
(provavelmente apenas substituir um de seusnext
combreak
..break something
funciona, funciona,break(something)
mastrue && break(somehting)
gera um erro de sintaxe. Apenas para sua informação. Se a condição for necessária, entãoif
ouunless
precisa ser usada.use a palavra-chave em
break
vez dereturn
fonte
Talvez você possa usar os métodos internos para localizar itens específicos em uma matriz, em vez de
each
-ingtargets
e fazer tudo manualmente. Alguns exemplos:Um exemplo seria fazer algo assim:
fonte
next
ebreak
parece fazer a coisa correta neste exemplo simplificado!saída: 1 3 4 5 6 7 8
fonte
Para sair de um bloco de rubi, basta usar a
return
palavra-chavereturn if value.nil?
fonte
return
sai da função?