0

有时我发现自己需要打开一个文件,读取它的内容并进行一些功能操作并将数据存储到一个变量中。这将得到以下代码行:

@some_vars = File.open("items.txt").read.chomp!.split(',')

我在这里有两个问题:

  • File 实例是否File.open()在此行之后关闭?
  • 如何在不牺牲可读性的情况下关闭这样的 File 实例?
4

3 回答 3

4

不,File.open让文件句柄保持打开状态。您应该改用IO.read它,它返回文件的全部内容并在完成后关闭它:

IO.read("items.txt").chomp!.split(',')

对于单行代码来说,这比将一个块传递给File.open.

于 2012-06-06T16:58:39.447 回答
1

您发布的示例不会自动关闭文件描述符。您必须在描述符上手动调用 File#close,或者让 Ruby 在解释器退出时自动关闭文件。

如果要自动关闭文件,则需要File#open 块语法

File.open('items.txt') { |f| f.read.chomp!.split(',') }

Ruby 将在块终止时关闭文件。

于 2012-06-06T17:00:07.497 回答
0

即使使用 block inFile.open也不能确保文件将始终关闭,例如,当应用程序挂起时。有一个技巧可以防止这种情况。

f = File.open('items.txt', 'w')

at_exit { f.flush; f.close }

然后at_exit块将在应用程序结束或程序退出时执行。

于 2012-06-06T17:09:10.133 回答