Here is 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
And here is 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
I thought about using raise, but I am trying to make it generic, so I don't want to put anything any specific in Foo
.
Best Answer
Use the keyword
next
. If you do not want to continue to the next item, usebreak
.When
next
is used within a block, it causes the block to exit immediately, returning control to the iterator method, which may then begin a new iteration by invoking the block again:When used in a block,
break
transfers control out of the block, out of the iterator that invoked the block, and to the first expression following the invocation of the iterator:And finally, the usage of
return
in a block:return
always causes the enclosing method to return, regardless of how deeply nested within blocks it is (except in the case of lambdas):