2010-11-19 39 views
25

我有一個關於塊的問題,這兩個代碼的意思是一樣的嗎?File.open與塊vs沒有

碼1

File::open('yozloy.txt','w') do |f| 
    f << 'Some contains' 
end 

碼2

newFile = File::open('yozloy.txt','w') 
newFile << 'Some contains' 
+1

我不認爲這很重要,但是將類方法編寫爲'File.open'而不是'File :: open'更常見。 – Telemachus 2010-11-19 15:58:04

+0

'code 2'不會自動關閉文件,就像'code 1'一樣。所以你需要做'newFile.close'。 – 2015-07-02 15:05:21

回答

25

DarkDust已經說過這些方法是不同的。我會解釋一些更多的塊,因爲我猜我可以猜出你爲什麼問這個問題;-)

ruby​​中的塊只是一些方法的參數。這不僅僅是一種不同的語法。

接受(可選)塊的方法通常有一個條件來測試它們是否被塊調用,或者沒有。

考慮這個非常簡單的例子:(真正的File.open是相似的,但它可以確保即使你塊引發錯誤的文件被關閉,例如)

def open(fname) 
    self.do_open(fname) 
    if block_given? 
    yield(self) # This will 'run' the block with given parameter 
    self.close 
    else 
    return self # This will just return some value 
    end 
end 

一般情況下,每一個方法可能與一個街區或沒有街區不同地工作(工作)。應始終在方法文檔中說明。

+0

優秀的解釋 – mko 2010-11-30 02:03:41

+0

我是Ruby的新手,我無法運行您的代碼。我試過「文件=打開(文件名)」,但我得到未定義的方法'do_open'爲主:對象(NoMethodError)。這個do_open方法來自哪裏? – Robert3452 2017-01-30 18:53:28

33

不,他們並不意味着相同。在第一個示例中,該文件在處理完塊後自動關閉。在第二個示例中,您有責任手動撥打newFile.close