为什么文件对象在Ruby中关闭后仍然存在?

时间:2012-10-31 00:06:52

标签: ruby irb

对象关闭后是否仍在内存中?如果是这样,那是因为垃圾收集尚未开始吗?看起来它只是被标记为已删除而不是实际从内存中消失。这是在IRB中产生的,如果它可能会影响它。

提前致谢!

1.9.3p125 :001 > f = File.open("myfile.txt", "r")
=> #<File:myfile.txt>     

1.9.3p125 :002 > f
=> #<File:myfile.txt>

1.9.3p125 :002 > f.size
 => 122 

1.9.3p125 :003 > f.close
 => nil 

1.9.3p125 :004 > f
 => #<File:myfile.txt (closed)> 

2 个答案:

答案 0 :(得分:3)

关闭文件后,对象仍然存在于内存中。你的变量f持有对它的引用,所以它还不能消失。就像任何其他对象一样,您仍然可以访问它,直到对它的所有引用消失为止。

答案 1 :(得分:1)

f是对类File的实例的引用。只要引用存在,实例(对象)就不会收集垃圾。现在,这个特定的对象碰巧有一个名为close的方法,它导致文件被关闭,但这对引用f没有任何作用,需要将其设置为指向垃圾的其他内容收集开始。

因此,为了摆脱对象,与任何其他一样,你必须为f指定其他内容 - File的实例没有特殊情况或任何其他类为您提供此类引用。 (事实上​​,如果任意方法可以默默地使您的引用变为nil,然后在尝试使用它时导致异常,那么这将是有问题的。)

修改:还要考虑一下,您可以通过调用f.closed?来检查文件是否已关闭。如果f在关闭时(或关闭后的某个时间)变为nil,则尝试在closed?引用上调用nil会导致异常......