有时我发现自己需要打开文件,读取内容并进行一些功能操作并将数据存储到变量中。这将最终得到以下代码:
@some_vars = File.open("items.txt").read.chomp!.split(',')
我在这里有两个问题:
File.open()
是否已关闭?答案 0 :(得分:4)
不,File.open
使文件句柄保持打开状态。你应该使用IO.read
代替它,它返回文件的全部内容并在完成后关闭它:
IO.read("items.txt").chomp!.split(',')
对于单行而言,这比将块传递给File.open
要短一些。
答案 1 :(得分:1)
您发布的示例不会自动关闭文件描述符。您必须在描述符上手动调用File#close,或者让Ruby在解释器退出时自动关闭文件。
如果您想自动关闭文件,则需要File#open block syntax:
File.open('items.txt') { |f| f.read.chomp!.split(',') }
Ruby会在块终止时关闭文件。
答案 2 :(得分:0)
即使在File.open
中使用块,也无法确保文件始终处于关闭状态,例如,应用程序暂停时。
有一种技巧可以防止这种情况发生。
f = File.open('items.txt', 'w')
at_exit { f.flush; f.close }
然后at_exit
块将在应用程序结束时或程序退出时执行。