在Ruby中File.open,open和IO.foreach有什么区别?

以下所有的API都做同样的事情:打开一个文件,并为每一行调用一个块。 有什么偏好,我们应该使用一个比另一个?

File.open("file").each_line {|line| puts line} open("file").each_line {|line| puts line} IO.foreach("file") {|line | puts line} 

这三种select之间有重要的区别。

File.open("file").each_line { |line| puts line }

  • File.open打开一个本地文件并返回一个文件对象
  • 该文件保持打开,直到你调用IO#close

open("file").each_line { |line| puts line }

Kernel.open查看string以决定如何处理它。

 open(".irbrc").class # => File open("http://google.com/").class # => StringIO File.open("http://google.com/") # => Errno::ENOENT: No such file or directory - http://google.com/ 

在第二种情况下,由Kernel#open返回的StringIO对象实际上包含http://google.com/的内容。; 如果Kernel#open返回一个File对象,它保持打开状态,直到你调用IO#close它。

IO.foreach("file") { |line| puts line }

  • IO.foreach打开一个文件,为它读取的每一行调用给定的块,然后closures文件。
  • 您不必担心closures文件。

File.read("file").each { |line| puts line }

你没有提到这个select,但这是我在大多数情况下使用的select。

  • File.read完全读取文件并将其作为string返回。
  • 您不必担心closures文件。
  • IO.foreach相比,这表明你正在处理一个文件。
  • 这个内存复杂度是O(n)。 如果你知道你正在处理一个小文件,这是没有缺点。 但是,如果它可以是一个大文件,并且你知道你的内存复杂度可能比O(n)小,不要使用这个选项。

它在这种情况下失败:

  s= File.read("/dev/zero") # => never terminates s.each … 

RI

ri是一个向您显示ruby文档的工具。 你在你的shell上这样使用它。

 ri File.open ri open ri IO.foreach ri File#each_line 

有了这个,你可以find几乎所有我在这里写的东西,还有更多。