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

StackOverflow https://stackoverflow.com/questions/602991

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Вот пример (на 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| блок стиля, или если они собирают мусор.Это может быть проблемой, если другой код (или модульные тесты) пытаются прочитать содержимое этого файла, а он еще не был сброшен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top