Ruby 从上面的上下文返回

Ruby 从上面的上下文返回,ruby,Ruby,这个问题有点复杂,但我会尽力解决。通过我们的代码,我们有如下代码片段 response = do_something() return response unless response.ok? 我想写一个包装器方法,这样就不需要这个步骤了,它看起来像这样 def rr(&block) response = yield unless response.ok? # somehow do return but in context above (magic needed he

这个问题有点复杂,但我会尽力解决。通过我们的代码,我们有如下代码片段

response = do_something()
return response unless response.ok?
我想写一个包装器方法,这样就不需要这个步骤了,它看起来像这样

def rr(&block)
  response = yield
  unless response.ok?
    # somehow do return but in context above (magic needed here)
  end
  response
end
在那之后,我将能够最小化上面的代码

response = rr { do_something() }

似乎不可能,但这是Ruby,所以也许有办法

难道你不想写一个包装器来实现这一点吗?从功能上看,您似乎只是忽略了非
ok?
响应:

def rr
  response = yield

  response.ok? ? response : nil
end

也许我在这里遗漏了一些东西,但我不明白为什么您需要在另一个上下文中强制执行
返回,这是无论如何都不可能的。

当出现问题时(这似乎是您正在尝试做的),跨堆栈的多个层返回的正确方法是引发异常:

class RequestFailedException < StandardError; end

def rr(&block)
  response = yield
  unless response.ok?
    raise RequestFailedException, "Response not okay: #{response.inspect}"
  end
  response
end

除了
rr
的实现之外,我认为您必须这样称呼它:
response=rr{do_something}
。谢谢,您是对的。这里的实现只是一个例子,我希望它能让我传播返回到上面的上下文。我们的代码中有数百个提到的代码片段,我正在寻找一种重构的方法。你需要一种不同的模式。正如Ajedi32所指出的,异常是您可能希望研究的一种流控制形式。
def do_lots_of_things()
  rr { do_something }
  rr { do_something_else }
  rr { another_thing }
end

begin
  do_lots_of_things
rescue RequestFailedException => e
  # Handle or ignore error
end