Ruby中的'a'是什么意思?open()`,什么是| f |意思?

时间:2011-04-01 20:47:17

标签: ruby

'a'|f|的含义是什么?

open('myfile.out', 'a') { |f|
  f.puts "Hello, world."
}

7 个答案:

答案 0 :(得分: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"在IO对象上调用puts然后写入文件时。

答案 1 :(得分:5)

'a'只是一个文件打开模式,就像你在C / C ++中看到的那样。这意味着追加,并且相对不常见 - 您更有可能熟悉'r'(阅读),'w'(写)等。

{|f| ... }位是令人兴奋的部分。它被称为aa block - 它们无处不在,而且它们可能是我最喜欢的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中最简单和最常见的块函数之一:

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

这一次,你的块被调用三次,每次一个不同的数组元素yieldword作为你的块 - 这是一个为每个元素调用一个函数的超级简单方法一个数组。

希望这会有所帮助,欢迎来到Ruby!

答案 2 :(得分:4)

'a' - >打开文件的模式('追加'模式) f是块的参数。块是可以执行的一段代码(它是下面的Proc对象)。

在这里,我认为f将是文件描述符。

答案 3 :(得分:3)

1)你调用open方法,传入两个参数:

  1. myfile.out< - 这是您要访问的文件
  2. a< - 你是说你要写一个文件,从文件的末尾开始(又名追加)
  3. 2)open中存在的Kernel方法产生IO stream object又名|f|,您可以在整个区块内访问。

    3)你将“hello world”附加到myfile.out

    4)块结束后,IO流关闭。

答案 4 :(得分:2)

'a'代表append,以只写模式打开文件,并在文件末尾开始写入。如果不存在文件,则创建新文件。有关详细信息,请参阅Ruby Docs

| f |是一个块参数,它在{}中传递。有关块的更多信息,请参阅The Pragmatic Programmer's Guide

答案 5 :(得分:2)

我强烈建议您阅读File class的帮助文件,了解初学者 您可以在那里看到open方法的文档 方法签名为File.open(filename, mode)
因此,在您的示例中,a是在这种情况下追加的模式。以下是mode参数的有效值列表:
'r' - 打开文件进行阅读。该文件必须存在。
'w' - 创建一个空文件进行编写。如果已存在具有相同名称的文件,则其内容将被删除,并且该文件将被视为新的空文件 'a' - 附加到文件。写操作会在文件末尾附加数据。如果文件不存在,则创建该文件 'r+' - 打开文件以便更新读写。该文件必须存在。
'w+' - 为读取和写入创建一个空文件。如果已存在具有相同名称的文件,则其内容将被删除,并且该文件将被视为新的空文件 'a+' - 打开文件进行阅读和追加。所有写入操作都在文件末尾执行,以保护以前的内容被覆盖。您可以将内部指针重新定位(fseek,倒带)到文件中的任何位置以进行读取,但写入操作会将其移回文件末尾。如果文件不存在,则创建该文件。

如果在块中使用File.open,例如在您的示例中,则f成为指向新打开文件的块变量,这允许您同时读取和写入文件只使用f作为参考,而在块内。使用这种形式的File.open很好,因为它会在块结束时自动关闭文件。

答案 6 :(得分:1)

open('myfile.out','a') - >这里'a'表示只写访问权限。指针位于文件末尾。

| F |是文件描述符,它确实是“Hello,World。”的推文。

而不是| f |,你可以写任何东西,比如说| abc |或者| line |,没关系。