这是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
这是
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
我考虑过使用提高,但我试图使其通用,所以我不想在
Foo
中放入任何特定内容。 最佳答案
使用关键字next
。如果您不想继续下一项,请使用break
。
在块中使用next
时,它将导致该块立即退出,将控制权返回给迭代器方法,该方法随后可以通过再次调用该块来开始新的迭代:
f.each do |line| # Iterate over the lines in file f
next if line[0,1] == "#" # If this line is a comment, go to the next
puts eval(line)
end
在块中使用时,
break
将控制权从块中转移出来,从调用该块的迭代器中转移出来,并转移到调用迭代器后的第一个表达式中:f.each do |line| # Iterate over the lines in file f
break if line == "quit\n" # If this break statement is executed...
puts eval(line)
end
puts "Good bye" # ...then control is transferred here
最后,在块中使用
return
:return
始终会导致封闭方法返回,无论其嵌套在块中的深度如何(lambda除外):def find(array, target)
array.each_with_index do |element,index|
return index if (element == target) # return from find
end
nil # If we didn't find the element, return nil
end
关于ruby - 如何从 ruby 块中爆发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1402757/