在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几乎所有我在这里写的东西,还有更多。