Удаление постоянных результатов в постоянных по-прежнему доступны
Проверь это Object
постоянная определяется
Module.const_defined?('Object')
#=> true
Удалить константу
Object.send(:remove_const, 'Object')
#=> Object
Проверь это Object
константа удаляется
Module.const_defined?('Object')
#=> false
Теперь, как следующие примеры возвращают Object
постоянная, если она удалена?:)
String.superclass
#=> Object
new_object = String.superclass.new
#=> #<Object:0x00007fdc18382858>
new_object.class
#=> Object
1 ответ
Теперь, как следующие примеры возвращают
Object
постоянная, если она удалена?
Они не Они не могут. Константы не являются объектами в Ruby, поэтому они не могут возвращать ::Object
постоянная.
Однако они могут вернуть объект, который отвечает inspect
со строкой 'Object'
, Объект, который оказывается тем же объектом, на который раньше ссылалась теперь удаленная ::Object
постоянная.
Удаление константы удаляет константу. Ничего более. В частности, он не удаляет объект, на который ссылается константа. Если эта константа была единственной ссылкой на этот объект, то этот объект теперь будет иметь право на сборку мусора. Но дело не в этом: ::Object
константа не единственная ссылка на Object
класс, так как каждый подкласс Object
класс имеет ссылку на Object
класс в своем superclass
указатель и каждый экземпляр Object
класс имеет ссылку на Object
класс в своем class
указатель. Кроме того, внутренние структуры данных механизма выполнения могут иметь или не иметь ссылки на Object
учебный класс.
Следовательно Object
Класс почти никогда не будет собирать мусор, и вы всегда будете иметь ссылку на него, через который вы можете получить к нему доступ, например, ''.class.superclass
даст вам доступ к Object
класс независимо от того, ::Object
константа все еще существует.
Короче говоря: вы путаете константу ::Object
с объектом, на который ссылается эта константа. Это распространенная ошибка новичка. Однако различие между названием вещи и самой вещью является фундаментальным почти во всех языках программирования.