2009-11-18 27 views
38

結帳這個代碼和輸出如何確保在紅寶石作品

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 

我期待的是在執行塊之後,然後確保將被執行,因爲確保返回true,調用該方法的最終輸出會'真正'。

回答

62

保證塊的返回值被丟棄 - 它只是一種在函數完成任何操作(並返回適當值)後進行清理的方法。原因在於它允許您在函數體中的不同位置放置多個return語句(或raise語句),而不必在函數的不同位置複製清理代碼。

+17

哇。 Ruby很棒。 – Trip 2012-05-08 18:53:54

+2

@Trip:很高興你喜歡它 - 它根本不是特定於ruby的。大多數具有異常處理的語言都以相同的方式工作(例如Java,Python)。 C++是規則的一個例外,但是可以使用析構函數做一些更強大的事情,比如[ScopeGuard](http://www.drdobbs.com/cpp/184403758)。 – 2012-05-08 20:07:52

-1

似乎你必須明確地返回true,ensure可能不會自動返回最後一個值。

12

請參閱this blog post瞭解ensure如何以隱式和顯式方式返回。

+0

這是一個很好的博客文章。但作者沒有明確提到,除非提到返回值,否則返回值將被丟棄。 – Roger 2009-11-18 16:34:20

+0

很棒的博客文章。絕對值得一讀。 – 2012-11-09 05:41:03