【问题标题】:Is it bad practice to not close the file in this snippet?不关闭此代码段中的文件是不好的做法吗?
【发布时间】:2012-05-10 06:37:26
【问题描述】:

只是思考一下关闭我在代码中明确打开的文件的必要性。我来自 C 和 C++ 编程背景,并开始在 Ruby 中导航。提前感谢您的反馈。

from_file, to_file = ARGV
script = $0

puts "Copying from #{from_file} to #{to_file}"
File.open(to_file, 'w').write(File.open(from_file).read())

puts "Alright, all done."

【问题讨论】:

  • 如果你只是想复制一个文件,你可以使用FileUtils.cp
  • @AndrewMarshall:很高兴现在知道。谢谢!
  • 不打开 fd 是不好的做法,就像小便后不拉上拉链是不好的做法一样。

标签: ruby file-io


【解决方案1】:

除非您在 python 中使用类似 with 的语句,否则不关闭文件总是不好的做法。

虽然脚本语言通常会在退出时关闭打开的文件,但在您完成文件后立即执行此操作会更简洁——尤其是在写入文件时。

ApparentlyRuby 有一些类似于 python 的with:

File.open(from_file, 'r') do |f_in|
    File.open(to_file, 'w') do |f_out|
        f_out.write(f_in.read)
    end
end

相关文档:http://ruby-doc.org/core-1.9.3/File.html#method-c-open

【讨论】:

  • 这意味着我需要额外的线来抓住把手。还是这样?
  • @stanigator:如果能提高代码质量,为什么你会关心(哪怕是一点点)添加几行代码?
  • 除此之外,我确信 ruby​​ 有一种简单的方法来复制文件,而无需您手动打开任何一个文件。
  • @ThiefMaster:我想我会在接下来的几天内找到答案。 Ruby 中的 do 和 Python 中的 with 是否都允许在代码命中 end 时自动进行文件 i/o 的垃圾收集?我也不熟悉 Python,它在我的学习清单上仅次于 Ruby。
  • @stanigator 不,这里的do...end 是一个block,它被传递给open 方法,然后打开文件,然后运行传递文件的块作为参数,当块完成运行时,它会关闭文件。
【解决方案2】:

这是一个较短的版本:

File.write to_file, File.read(from_file)

【讨论】:

    【解决方案3】:

    此代码 (Matheus Moreira) 自动关闭文件:

    File.write to_file, File.read(from_file)
    

    这段代码没有办法关闭文件:

    File.open(to_file, 'w').write(File.open(from_file).read())
    

    我猜也会自动关闭。

    【讨论】:

    • 不知道我也可以在 1 行中做到这一点。
    【解决方案4】:

    这是一个很好的答案,但将输出文件放在外部块上并使用

    File.open(to_file, 'w') do |f_out|
      f_out << File.open(from_file){|f| f.read}
    end
    

    请注意阅读时不需要“r”。

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2010-09-26
      • 2020-07-26
      相关资源
      最近更新 更多