Теперь, как в следующих примерах возвращается константа Object
, если она удалена?
Нет.Они не могут .Константы не являются объектами в Ruby, поэтому они не могут возвращать ::Object
константу.
Они могут , однако возвращают объект, который реагирует на inspect
со строкой 'Object'
.Объект, который оказывается тем же объектом, на который раньше ссылалась теперь удаленная ::Object
константа.
Удаление константы удаляет константу.Ничего более.В частности, не не удаляет объект, на который ссылается константа. IFF эта константа была только ссылкой на этот объект, THEN этот объект теперь будет иметь право на сборку мусора.Но это не тот случай: константа ::Object
не является единственной ссылкой на класс Object
, поскольку каждый подкласс класса Object
имеет ссылку на класс Object
в своем указателе superclass
икаждый экземпляр класса Object
имеет ссылку на класс Object
в своем указателе class
.Кроме того, внутренние структуры данных механизма выполнения могут иметь или не иметь ссылки на класс Object
.
Следовательно, класс Object
почти никогда не будет собирать мусор, и у вас всегда будут какие-то ссылкик нему, с помощью которого вы можете получить к нему доступ, например, ''.class.superclass
даст вам доступ к классу Object
независимо от того, существует ли константа ::Object
.
Короче говоря: вы путаетеконстанта ::Object
с объектом, на который ссылается эта константа.Это распространенная ошибка новичка.Однако различие между названием вещи и самой вещью является фундаментальным почти во всех языках программирования.