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