Ruby:为什么援救块值而不是确保块?

Ruby:为什么援救块值而不是确保块?,ruby,exception,Ruby,Exception,Ruby方法中的一个规则是返回最后执行的块的值,如下所示: def boom if false "a" else "double a" end end p boom # "double a" 但是当我创建这样的化合物时,它包括救援和确保。确保是执行的最后一个块,但返回救援块中的值。为什么会这样 def a 1.some_weird_method "Boom" rescue NoMethodError p "An

Ruby方法中的一个规则是返回最后执行的块的值,如下所示:

def boom
    if false
        "a"
    else
        "double a"
    end
end

p boom # "double a"
但是当我创建这样的化合物时,它包括
救援
确保
确保
是执行的最后一个块,但返回
救援
块中的值。为什么会这样

def a
    1.some_weird_method
    "Boom"
rescue NoMethodError
    p "An Error: " + $!.message
ensure
    p "This  value must be returned"
end

p "Why do rescue block returns?:" + a
p RUBY_VERSION
输出为:

Finished in 44 ms
"An Error: undefined method `some_weird_method' for 1:Integer"
"This  value must be returned"
"Why do rescue block returns?:An Error: undefined method `some_weird_method' for 1:Integer"
"2.4.6"

可以在此处测试代码:

确保默认情况下
不会更改返回值。您可以通过在
确保
中显式调用
return
来绕过这个问题,不过我没有太经常(如果有的话)看到这种模式


因为Ruby就是这样实现的(我认为这样做更有意义)<代码>确保
无论成功与否都能运行,这样你最终可能会吃到你真正关心的东西。(注意,如果你返回某个引用,你仍然可以修改被引用的内容,尽管我不会这样做,因为这会导致一些认知开销。)