2009-12-11 90 views
1

任何人都可以提供一些线索,为什么这两个代码段不相等?我唯一的想法是,后面的代码部分中的.open不在块中,并且文件句柄保持打开状态。红宝石I/O - 文件句柄左打开

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

而这一次

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

感谢。

回答

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

输出的 ruby test.rb f
hello! 

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

唯一的区别在于,当File.open是,它会自动给定的块关闭文件句柄。

HTH

5

请参阅IO class's API

如果File.open被赋予一个块,它将打开该文件,执行该块,然后关闭该文件。

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