File.open()有没有块有什么区别?

时间:2011-08-14 16:31:39

标签: ruby file file-io

我有两个问题: 1 - 我不明白这个代码返回的东西的含义:

File.open("a.txt") do |i|
  puts i
end
请告诉我。

2 - 请解释一下该代码与以下代码之间的区别 代码:

File.open("a.txt").each do |i|
  puts i
end

感谢

2 个答案:

答案 0 :(得分:6)

使用:

File.open( "some_file.txt" ) do |file|
  puts file.read
end

open方法使用 File 实例调用块,并在块返回后清理文件引用,根据需要关闭并刷新文件,这样您的应用程序就不会泄漏文件处理程序,这是因为我们通常忘记关闭文件或者没有考虑到文件处理可能会产生异常,所以很棒。

当你这样做时:

file = File.open("some_file.txt")
puts file.read

open方法为您提供文件实例,但现在您负责清理混乱并在不再需要时关闭文件。因此,如果您这样做,您应该将文件设置为开始/救援块,并在出现任何问题时添加一个关闭文件的ensure子句。

除非你有非常特殊的需要,否则你永远不应该使用第二个版本,第一个版本更简单,更安全,你不必关心你对文件所做的任何事情的关闭/清理。

答案 1 :(得分:2)

您通常可以在控制台中输入如此简单的内容,并立即得到答案。

因此对于包含内容的文件a.txt:

one
two
three

您的代码将执行此操作:

[johnmartirano@mbp]$ irb
ruby-1.9.2-p180 :007 > File.open("a.txt") do |i|
ruby-1.9.2-p180 :008 >     puts "a.txt:"+i.to_s
ruby-1.9.2-p180 :009?>   end
a.txt:#<File:0x000001010e7ae8>
 => nil 
ruby-1.9.2-p180 :010 > File.open("a.txt").each do |i|
ruby-1.9.2-p180 :011 >     puts "a.txt:"+i.to_s
ruby-1.9.2-p180 :012?>   end
a.txt:one
a.txt:two
a.txt:three
 => #<File:a.txt> 

所以第一个打印File对象引用/地址。

第二个遍历文件中的行并打印每一行。

希望有所帮助