所有以下API都做同样的事情:打开一个文件并为每一行调用一个块。是否有任何偏好我们应该使用一个而不是另一个?
File.open("file").each_line {|line| puts line}
open("file").each_line {|line| puts line}
IO.foreach("file") {|line | puts line}
答案 0 :(得分:81)
这三种选择之间存在重要差异。
File.open("file").each_line { |line| puts line }
File.open
打开一个本地文件并返回一个文件对象IO#close
open("file").each_line { |line| puts line }
Kernel.open
查看字符串以决定如何处理它。
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/
在第二种情况下,StringIO
返回的Kernel#open
对象实际上包含http://google.com/的内容。如果Kernel#open
返回File
个对象,则会保持打开状态,直到您在其上调用IO#close
。
IO.foreach("file") { |line| puts line }
IO.foreach
打开一个文件,为其读取的每一行调用给定的块,然后关闭该文件。File.read("file").each { |line| puts line }
你没有提到这个选择,但这是我在大多数情况下会使用的选择。
File.read
完全读取文件并将其作为字符串返回。IO.foreach
相比,这表明您正在处理文件。在这种情况下失败了:
s= File.read("/dev/zero") # => never terminates
s.each …
ri是一个向您显示ruby文档的工具。你可以在shell上使用它。
ri File.open
ri open
ri IO.foreach
ri File#each_line
有了这个,你几乎可以找到我在这里写的所有东西。