以下所有API都做同样的事情:打开一个文件并为每一行调用一个块.我们是否应该 Select 其中一个而不是另一个?
File.open("file").each_line {|line| puts line}
open("file").each_line {|line| puts line}
IO.foreach("file") {|line | puts line}
以下所有API都做同样的事情:打开一个文件并为每一行调用一个块.我们是否应该 Select 其中一个而不是另一个?
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
查看字符串以决定如何处理它.
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
打开一个文件,为它读取的每一行调用给定的块,然后关闭该文件.File.read("file").each { |line| puts line }
你没有提到这个选项,但在大多数情况下我都会使用这个选项.
File.read
完全读取文件并将其作为字符串返回.IO.foreach
相比,这表明你正在处理一个文件.在这种情况下,它失败了:
s= File.read("/dev/zero") # => never terminates
s.each …
ri是一个向您展示ruby文档的工具.你把它用在你的壳上.
ri File.open
ri open
ri IO.foreach
ri File#each_line
有了这个,你可以找到我在这里写的几乎所有东西,还有更多.