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