为什么文件对象在它之后仍然存在';她在Ruby关门了?
对象关闭后是否仍在内存中?如果是,那是因为垃圾收集还没有开始?看起来它只是被标记为已删除,而不是实际从内存中消失。这是在IRB中产生的,如果这会影响它的话 提前谢谢为什么文件对象在它之后仍然存在';她在Ruby关门了?,ruby,irb,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.s
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)>
1.9.3p125:001>f=File.open(“myfile.txt”、“r”)
=> #
1.9.3p125:002>f
=> #
1.9.3p125:002>f尺寸
=> 122
1.9.3p125:003>f.关闭
=>零
1.9.3p125:004>f
=> #
关闭文件后,对象仍存在于内存中。您的变量f
包含对它的引用,因此它还不能消失。与任何其他对象一样,您仍然可以访问它,直到对它的所有引用消失。关闭文件后,该对象仍存在于内存中。您的变量f
包含对它的引用,因此它还不能消失。与任何其他对象一样,您仍然可以访问它,直到对它的所有引用都消失。f
是对类文件的引用。只要引用存在,实例(对象)就不会被垃圾回收。现在,这个特定的对象碰巧有一个名为close
的方法,该方法导致文件被关闭,但它对引用f
没有任何作用,需要将该引用设置为指向其他对象,垃圾收集才能启动
因此,为了摆脱对象,像其他任何对象一样,您必须为f
指定其他对象-对于File
或任何其他类的实例,没有特殊情况可以将此类引用归零。(事实上,如果任意方法可以悄悄地使您的引用变为nil
,然后在您尝试使用它时导致异常,这将是一个问题。)
<> > >编辑< /强>:也考虑这样一个事实,即您可以通过调用<代码> f.Cutely.<代码>来检查文件是否关闭。如果f
在关闭时(或关闭后的某个时间)变为nil
,尝试调用nil
引用上的closed?
将导致异常…f
是对类文件的引用。只要引用存在,实例(对象)就不会被垃圾回收。现在,这个特定的对象碰巧有一个名为close
的方法,该方法导致文件被关闭,但它对引用f
没有任何作用,需要将该引用设置为指向其他对象,垃圾收集才能启动
因此,为了摆脱对象,像其他任何对象一样,您必须为f
指定其他对象-对于File
或任何其他类的实例,没有特殊情况可以将此类引用归零。(事实上,如果任意方法可以悄悄地使您的引用变为nil
,然后在您尝试使用它时导致异常,这将是一个问题。)
<> > >编辑< /强>:也考虑这样一个事实,即您可以通过调用<代码> f.Cutely.<代码>来检查文件是否关闭。如果f
在关闭时(或关闭后的某个时间)变为nil
,尝试调用nil
引用上的closed?
将导致异常…这对于文件来说并不是什么特别的事情。这是关于变量的一般性问题。如果在某个时刻,f
突然开始丢失其引用对象,那么它将是一团混乱。这不是文件的特殊之处。这是关于变量的一般性问题。如果在某个时刻,f
突然开始丢失它的referent,那么它将是一团混乱。我想我认为文件是不同的,因为有一个close方法。你知道close方法的实际作用吗?它只是一个标志,用来阻止任何进一步的代码对其进行操作吗?显然,close
方法会关闭文件。也就是说,在内部,文件
对象基本上是平台文件描述符的包装器。但是仅仅因为一个方法被称为close并不意味着它有什么特殊性,它可以在您不知道的情况下以某种方式将引用设置为nil
。。例如,如果您要编写自己的类MyFile
,您将如何实现close
方法以将引用设置为nil
?你的类的用户怎么知道是你做的,或者你只是在那个特定的方法中做的close
只是一个词。我想我认为文件是不同的,因为有一个close方法。你知道close方法的实际作用吗?它只是一个标志,用来阻止任何进一步的代码对其进行操作吗?显然,close
方法会关闭文件。也就是说,在内部,文件
对象基本上是平台文件描述符的包装器。但是仅仅因为一个方法被称为close并不意味着它有什么特殊性,它可以在您不知道的情况下以某种方式将引用设置为nil
。。例如,如果您要编写自己的类MyFile
,您将如何实现close
方法以将引用设置为nil
?你的类的用户怎么知道是你做的,或者你只是在那个特定的方法中做的<代码>关闭
只是一个词。