当变量超出范围时,是否意味着它不存在?

我不确定我是否理解范围 – 一个超出范围的变量(我正在使用Ruby)存在于某个地方的内存中,或者它是否停止存在(我知道你无法访问它)。 说超出范围的变量不再存在是否不准确?

也许这是一个哲学问题。

如果您使用托管语言,那么您不会分配和取消分配内存,因此就您而言它不再存在。

从技术上来说它确实如此,但是GC往往不具有确定性,所以从技术上来说很难说它何时会消失。

变量与其保存的值不同。

当变量超出范围时,变量本身就不再存在。 变量保持的可以表示对象,并且该对象可以在变量的生命周期之外继续存在。 垃圾收集器稍后回收该对象。

当它超出范围时,它仍然存在(在某种意义上它有一些内存分配给它)一段时间,直到垃圾收集清理它。 但正如你暗示的那样,它失去了它的名字并且无法到达。

当变量超出范围时,周围的任何人都会听到它尖叫吗?

这不是一个ruby问题,而是关于垃圾收集的一般问题。 在垃圾收集语言(如Ruby或C#)中,当变量超出范围时,它会以某种方式标记,表明它已不再使用。 当发生这种情况时,你不能再得到它并且它绕着它的拇指摆动 – 但它仍然有分配给它的记忆。

在某些时候,垃圾收集器将唤醒并查找标记为未使用的变量。 它将处置它们,此时它们根本就不再存在。

它可能比这更复杂,取决于垃圾收集器的工作方式,但它足够接近:)

它存在一点点,直到垃圾收集器处理它(如果它可以)。

Rob Kennedy对此做出了适当的回答,但我想我会添加一些细节。

要认识到的重要一点是变量与它所代表的值之间的差异。

这是一个例子(在C#中,因为我不知道Ruby):

 object c = null; if (1 == 1) // Just to get a different scope { var newObj = new SomeClass(); newObj.SomeProperty = true; c = newObj; } 

在上面的代码中,newObj超出了if语句末尾的范围,因此“不存在”,但它引用的值仍然存活且很好,由c引用。 一旦对象的所有引用都消失了,那么垃圾收集器将负责清理它。

如果你在谈论文件对象,它不仅仅是一个哲学问题。 如果我没记错的话,文件在超出范围时不会自动关闭 – 只有在你要求它们关闭时才关闭,或者你使用File.open do |file| 样式块,或者如果他们收集垃圾。 如果其他代码(或unit testing)尝试读取该文件的内容并且尚未刷新,则可能会出现问题。