2011-04-01 243 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是很好的,因为它在块结束时自动处理关闭文件。