Когда переменная выходит из области видимости, значит ли это, что она не существует? - PullRequest
4 голосов
/ 02 марта 2009

Я не уверен, что понимаю область действия - существует ли в памяти где-то переменная вне области видимости (я использую Ruby) или она перестает существовать (я знаю, что вы не можете получить к ней доступ). Было бы неправильно сказать, что переменная вне области больше не существует?

Может быть, это философский вопрос.

Ответы [ 7 ]

5 голосов
/ 02 марта 2009

Если вы используете управляемый язык, вы не выделяете и не распределяете память так, как вам кажется, она больше не существует.

Технически это так, но GC, как правило, не являются детерминированными, так что технически трудно сказать, когда они действительно исчезают.

3 голосов
/ 02 марта 2009

Переменная не совпадает со значением, которое она содержит.

Сама переменная перестает существовать, когда выходит из области видимости. Значение , которое хранится в переменной, может представлять объект, и этот объект может продолжать существовать и после времени жизни переменной. Сборщик мусора восстанавливает объект позже.

2 голосов
/ 02 марта 2009

Когда переменная выходит из области видимости, кто-нибудь вокруг слышит ее крик?

Это не вопрос рубина, а общий вопрос о сборке мусора. В языке сборки мусора, таком как Ruby или C #, когда переменная выходит из области видимости, она помечается некоторым образом, который говорит, что он больше не используется. Когда это происходит, вы уже не можете этого понять, и он бездельничает, но ему все еще выделяется память.

В какой-то момент сборщик мусора проснется и будет искать переменные, помеченные как неиспользуемые. Он избавится от них, и в этот момент их больше не будет в памяти.

Это может быть более сложным, чем это, в зависимости от того, как работает сборщик мусора, но это достаточно близко:)

2 голосов
/ 02 марта 2009

Когда он выходит из области видимости, он все еще существует (в том смысле, что ему выделено некоторое количество памяти) в течение некоторого времени, пока сборщик мусора не очистит его. Но, как вы подразумеваете, он потерял свое имя и недоступен.

1 голос
/ 02 марта 2009

Роб Кеннеди ответил соответствующим образом, но я подумал, что добавлю немного больше деталей.

Важно признать разницу между переменной и значением, которое она представляет.

Вот пример (в 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. После того как все ссылки на объект исчезнут, сборщик мусора позаботится о его очистке.

1 голос
/ 02 марта 2009

Он существует немного, пока сборщик мусора не утилизирует его (если может).

0 голосов
/ 03 марта 2009

Если вы говорите о файловых объектах, это становится больше, чем философским вопросом. Если я правильно помню, файлы не закрываются автоматически, когда выходят из области видимости - они закрываются, только если вы просите их закрыть, или если вы используете блок стиля File.open do |file|, или если они получают сборщик мусора. Это может быть проблемой, если другой код (или модульные тесты) пытаются прочитать содержимое этого файла, и он еще не был сброшен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...