以下所有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相比,这表明你正在处理一个文件.
  • 这个函数的内存复杂度是O(n).如果你知道你正在处理一个小文件,这是没有缺点的.但是如果它可能是一个大文件,并且你知道你的内存复杂度可能小于O(n),那么不要使用这个选项.

在这种情况下,它失败了:

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

ri

ri是一个向您展示ruby文档的工具.你把它用在你的壳上.

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

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

Ruby相关问答推荐

根据部分已知值判断数组内容的简洁 Rubyist 方法是什么?

Homebrew 的 ruby​​ 和Homebrew Ruby有什么区别?

ASDF 上缺少 Ruby 版本

多线程期间的 MRI ruby​​ 内存访问特性

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

rbenv 没有显示可用的 ruby​​ 版本

Ruby 中是否有像 C 中一样的主要方法?

为什么 Ruby 使用 respond_to?而不是 responds_to?

try 学习/理解 Ruby 的 setter 和 getter 方法

从 1 开始循环

使用 Ruby,我如何迭代一个 for 循环 n.times

有没有办法从该实例内部为 Ruby 类的实例创建方法?

从字符串中删除所有特殊字符 - ruby

. vs ::(点与双冒号)用于调用方法

相当于 Ruby 中的通过

确定Ruby的位置

如何在 ruby​​ 中进行命名捕获

Ruby on rails - 静态方法

如何在器上下文中运行 ruby​​ 脚本?

如何在 Rails 应用程序中使用 httparty 的基本身份验证?