Ruby 1.8.7中的File.open和块

6

我对Ruby还不太熟悉,目前正在阅读《Ruby程序设计》以便快速掌握该语言。我看到了有关File.open的部分,其中讨论了将块作为参数传递给File.open调用,然后保证文件被关闭。现在这听起来像是一种避免自己陷入困境的绝佳方法,而我现在已经十分危险了,所以我想试一试。以下是我在irb中写的代码:

File.open('somefile.txt', 'r').each { |line| puts line }``

我原本期望文件somefile.txt会被打开、读取、输出并关闭,对吧?但据我所知并不是这样。如果我使用lsof查看打开的文件句柄,它仍然是打开状态。然而,如果我执行以下操作:

f = File.open('somefile.txt', 'r').each { |line| puts line }
f.close()

我在这个例子中是否错误地使用了块,或者我没有理解使用块时File.open的含义。我已经阅读了与File.open相关的ruby-doc.org章节,但似乎只是确认我所做的应该按预期工作。
有人能解释一下我做错了什么吗?
1个回答

8
为了在块结束后关闭文件,您应该直接将块传递给File.open(),而不是传递给each
File.open('somefile.txt', 'r') do |f| 
  f.each_line { |l| puts l }
end

File.open(…).each {…} 只是在打开文件后对其进行迭代,而没有关闭它。


File.open('somefile.txt', 'r') { |f| f.each_line { |line| puts line } } 也可以正常工作。谢谢! - OldTroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接