2010-08-26 54 views
4

我試圖驗證一個文本是否已經寫入文件(build.log)後執行將引發異常的耙子任務。檢出下面的代碼片斷,一個是開始工作,而lambda拋出一條消息,說它找不到build.log文件。lambda和begin塊之間有什麼區別?

使用開始測試。(作品)

begin 
    Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log 
    rescue 
    end 
    IO.read(@[email protected]_id+"/build.log").should match(/.*destination.*already.*exists.* /) 

試圖測試使用lambda相同。 (不起作用)

lambda { 
    Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log 
    } 
    IO.read(@[email protected]_id+"/build.log").should match(/.*destination.*already.*exists.* /) 

這兩個有什麼區別?

回答

5

你在想lambda錯誤。 lambda是可運行代碼的暫停。我說暫停了,因爲它已經準備好運行,甚至準備好參加論壇,但它還沒有做任何事情完成

例如,請考慮以下的(通過)規格:

flag = false 
x = lambda {   # Here, we suspend a function to set our flag. 
    flag = true 
} 

flag.should == false # The code in the lambda is still suspended; 
         # it hasn't done any work. 

x.call     # Now we ran the suspended function. 
flag.should == true 

注意兩件事情:

  1. 我得到了一個對象lambda關鍵字。你也得到這個對象,但是因爲你沒有把它分配給一個變量,它會立即丟失。 ;)
  2. 我使用call方法來實際執行暫停(即在lambda中)的代碼。在你舉的例子中,你實際上並沒有運行git:checkout任務!

begin ... rescue ... end是一個完全不同的機制:目的是正確處理(或在你的情況下,吞下)異常。堅持這種形式;這是唯一一個能夠滿足你需求的人。 :)

+0

非常感謝。你的回答澄清了我的困惑。 – Muthu 2010-09-01 22:12:11

相關問題