这是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/

10-09 12:36