gpt4 book ai didi

ruby - Ruby 中的 File.open、open 和 IO.foreach 有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:18 25 4
gpt4 key购买 nike

以下所有 API 都做同样的事情:打开一个文件并为每一行调用一个 block 。我们应该优先使用一个而不是另一个吗?

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

最佳答案

这 3 个选择之间存在重要差异。

File.open("file").each_line { |行|放置行

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

open("file").each_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("文件") { |行|放置行

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

File.read("file").each { |行|放置行

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

  • File.read 完整读取文件并将其作为字符串返回。
  • 您不必担心关闭文件。
  • IO.foreach 相比,这很清楚,您正在处理一个文件。
  • 此操作的内存复杂度为 O(n)。如果你知道你正在处理一个小文件,这不是缺点。但是如果它可以是一个大文件并且您知道您的内存复杂度可以小于 O(n),请不要使用此选项。

在这种情况下它失败了:

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

ri 是一个显示 ruby​​ 文档的工具。你可以像这样在你的 shell 上使用它。

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

有了它,您几乎可以找到我在这里写的所有内容以及更多内容。

关于ruby - Ruby 中的 File.open、open 和 IO.foreach 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com