如何在Ruby中强制返回LocalJumpError?

时间:2010-12-01 14:45:11

标签: ruby

我的函数bar得到一个块,我想在不允许return的情况下运行此块。如何仅通过修改下面的bar并保留其他所有内容(包括foo)来完成此操作?

def bar()
  yield
end
def foo()
  bar do
    p "it"
    return  # This works. But I'd like to get LocalJumpError.
  end
end
foo

3 个答案:

答案 0 :(得分:1)

当您尝试将带有LocalJumpError的块传递给return(而不是Proc)时,会得到lambda。< /击>

<击>

如果您执行类似

之类的操作,除了调用它之外,您可以不改变foo
def bar()
  Proc.new
end

def foo()
  bar do
    p "it"
    return
  end
end

foo[]

这会产生LocalJumpError

无论如何,this article可能会有所帮助。

编辑:proc中的return将从外部方法返回,而不是从块中的匿名方法返回。您可以设置一个标记,您可以在bar中查看它是否过早返回:

bar_finished = false

def bar(&block)
  proc = Proc.new &block
  l.call
  bar_finished = true
end

然后,如果return中的bar传递给bar_finished,则{{1}}仍为假。不确定是否添加这样的非局部变量是一个选项,但是如果是这样,你可以跟踪块的返回并抛出你想要的任何异常。

答案 1 :(得分:1)

如果您希望在yield之后完成某些“清理”代码,那么您可能需要使用begin然后使用ensure

答案 2 :(得分:0)

根据其他答案中的建议,我设法解决了这个问题:

def bar()
  has_returned = true
  begin
    x = yield
    has_returned = false
    x
  rescue
    has_returned = false
    raise
  ensure
    raise LocalJumpError if has_returned
  end
end
def foo()
  bar do
    p "it"
    return  # This makes bar raise a LocalJumpError.
  end
end
foo