如何确保在红宝石中起作用

Rog*_*ger 41 ruby

结帐此代码和输出

def lab
  yield
  ensure
    puts 'in ensure block'
    true
end

puts lab { puts 'inside inline block'; false }

output is
#inside inline block
#in ensure block
#false
Run Code Online (Sandbox Code Playgroud)

我希望在执行块后确保执行,因为确保返回true,调用方法的最终输出将为'true'.

Ken*_*oom 67

保证块的返回值被丢弃 - 它只是在函数执行任何预期后清理的方法(并返回适当的值).这样做的原因是它允许您将多个return语句(或raise语句)放在函数体的不同位置,而不必在函数的不同位置复制清理代码.

  • 哇.Ruby太棒了. (17认同)
  • @Trip:很高兴你喜欢它 - 它根本不是特定于ruby的.大多数具有异常处理的语言都以相同的方式工作(例如Java,Python).C++是一个例外,但也有一些更强大的东西,你可以用析构函数做,如[ScopeGuard(http://www.drdobbs.com/cpp/184403758). (2认同)

mik*_*kej 12

有关隐式和显式返回行为的概述,请参阅此博客文章ensure.