任何人都可以提供一些線索,爲什麼這兩個代碼段不相等?我唯一的想法是,後面的代碼部分中的.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}
感謝。
任何人都可以提供一些線索,爲什麼這兩個代碼段不相等?我唯一的想法是,後面的代碼部分中的.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}
感謝。
文件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
請參閱IO class's API。
如果File.open被賦予一個塊,它將打開該文件,執行該塊,然後關閉該文件。
如果沒有給出塊,它會返回一個代表該文件的對象(就像File :: new一樣),所以它仍然可以打開。