Ruby I / O - 文件句柄左打开

时间:2009-12-11 16:38:36

标签: ruby

任何人都可以提供一些线索,说明为什么这两段代码不相同?我唯一想到的是后一个代码部分中的.open不在块中,文件句柄保持打开状态。

File.open(file) do |io|
  io.each_line do |line|
    body_string << line
  end
end

和这一个

File.open(file).each_line {|line| body_string << line}

感谢。

2 个答案:

答案 0 :(得分:5)

请参阅IO class's API

如果给File.open一个块,它会打开文件,执行块,然后关闭文件。

如果没有给出一个块,它会返回一个表示该文件的对象(就像File :: new一样),因此它可能仍然被打开。

答案 1 :(得分:3)

档案test.rb

def test1
  body_string = []
  [ File.open(ARGV[0]).each_line { |line| body_string << line }, body_string ]
end
def test2
  body_string = []
  [ File.open(ARGV[0]) do |io|
    io.each_line { |line| body_string << line }
  end, body_string ]
end
puts(test1.inspect)
puts(test2.inspect)

档案f

hello!

ruby test.rb f的输出:

[#<File:f>, ["hello!\n"]]
[#<File:f (closed)>, ["hello!\n"]]

唯一的区别是,当File.open被赋予一个块时,它会自动关闭文件句柄。

HTH