2011-04-01 139 views

回答

5

'a'只是一種文件打開模式,就像您在C/C++中看到的一樣。這意味着追加,並且相對不常見 - 你更可能熟悉'r'(已閱讀),'w'(寫)等。

{|f| ... }位是令人興奮的部分。它被稱爲一個塊 - 它們無處不在,它們可能是我最喜歡的Ruby的一部分 - 我最近回到了C++,並且我發現自己詛咒語言,因爲它始終不支持它們

的代碼認爲像foo(bar) {|baz| ... }如創建一個無名函數,並且傳遞給函數作爲另一個(隱藏)參數foo(有點像this是一個隱藏的參數在C++中的成員函數) - 它只是不爲隱藏,「原因你在那裏指定它。

現在,當您將塊傳遞給foo時,它最終將調用您的塊(使用yield語句),並且它將提供參數baz。如果我的foo表現得像你File.open功能,它的定義會是這個樣子:

def foo(filename, &block) 
    file = File.open(filename) 
    yield(file) 
    file.close 
end 

你可以看到它是如何打開的文件,它yield傳遞給你的塊,然後關閉,一旦你塊返回文件。非常方便 - 塊是你的朋友!

另一個不錯的地方,開始包裝你的頭部周圍是each功能 - 在Ruby的最簡單,最常用的模塊功能之一:

[[email protected] ~]$ irb 
irb(main):001:0> ['Welcome', 'to', 'Ruby!'].each {|word| puts word} 
Welcome 
to 
Ruby! 
=> ["Welcome", "to", "Ruby!"] 
irb(main):002:0> 

這個時候,你的塊被調用三次,每時間一個不同的數組元素得到yield作爲word編輯到你的塊 - 這是一個非常簡單的方法來調用一個數組的每個元素的函數。

希望這會有所幫助,歡迎來到Ruby!

+0

感謝所有的優秀答案。無法相信下面的代碼可以在幾行代碼中實現我想要的內容,只需將其附加到dir樹中的文件即可。 - require'find' Find.find(「c:\\ test \\」)do | filename | if!FileTest.directory?(filename) puts filename open(filename,'a'){| f | f.puts「你好,世界。」 } end end – 2011-04-01 23:14:26

4

'A' - >在其中打開該文件( '追加' 模式)模式 f是所述塊的參數。塊是可以執行的一段代碼(它是下面的一個Proc對象)。

這裏,f是文件描述符,我想。

7

從紅寶石IO doc

"a" | Write-only, starts at end of file if file exists, 
     | otherwise creates a new file for writing. 

|f|是保持在塊中的IO對象(一切在{})的變量。所以當你f.puts "Hello World"你打電話給puts IO對象然後寫入文件。

2

「a」代表追加,以只寫模式打開文件,並開始在文件末尾寫入。如果沒有文件存在,則會創建一個新文件。請參閱Ruby Docs瞭解更多信息。

The | f |是一個塊參數,它在{}中傳遞。有關塊的更多信息,請參閱The Pragmatic Programmer's Guide

1

open('myfile.out','a') - >這裏的'a'表示只寫訪問。指針位於文件的末尾。

| f |是文件描述符,它放置了「Hello,World」。

而不是| f |,你可以寫任何東西,比如說| abc |或|行|,沒關係。

3

1)你調用open方法,傳遞兩個參數:

  1. myfile.out < - 這是您要訪問
  2. 一個<文件 - 就表示要寫入到文件中,起始於文件的末尾(又名附加)

2)存在於Kernel的方法open,產生一個IO stream object又名|f|,其中喲你可以訪問整個塊。

3)要附加的 「hello world」 到myfile.out

4)一旦塊結束時,在IO流關閉。

2

我強烈建議通讀File class的幫助文件來閱讀初學者。
您可以在那裏看到open方法的文檔。
方法簽名爲File.open(filename, mode)
所以,在你的榜樣,a,就是在這種情況下是追加模式。以下是mode參數的有效值列表:
'r' - 打開文件以供閱讀。該文件必須存在。
'w' - 創建一個空文件進行寫入。如果已存在具有相同名稱的文件,則其內容將被刪除,並將該文件視爲新的空文件。
'a' - 追加到文件。寫操作將數據追加到文件的末尾。如果該文件不存在,則會創建該文件。
'r+' - 打開文件進行更新讀寫。該文件必須存在。
'w+' - 爲閱讀和寫作創建一個空文件。如果已存在具有相同名稱的文件,則其內容將被刪除,並將該文件視爲新的空文件。
'a+' - 打開文件進行閱讀和追加。所有寫入操作都在文件末尾執行,以保護以前的內容被覆蓋。您可以將內部指針重新定位(fseek,倒回)到文件中的任何位置進行讀取,但寫入操作會將其移回文件末尾。如果該文件不存在,則會創建該文件。

如果File.open在一個塊中使用,比如在你的榜樣,那麼f成爲塊變量指向新打開的文件,它允許您讀取和只用f作爲參考寫入文件,而在塊內。使用這種形式的File.open是很好的,因爲它在塊結束時自動處理關閉文件。