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

时间:2009-03-02 16:32:10

标签: ruby variables scope

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

也许这是一个哲学问题。

7 个答案:

答案 0 :(得分:5)

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

技术上确实如此,但GC往往不具有确定性,所以在技术上很难说它什么时候会消失。

答案 1 :(得分:3)

变量与其保存的值不同。

变量本身在超出范围时不再存在。变量所持有的可能代表一个对象,并且该对象可能会继续存在于变量的生命周期之外。垃圾收集器稍后回收该对象。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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引用。一旦对该对象的所有引用都消失了,那么垃圾收集器将负责清理它。

答案 6 :(得分:0)

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