Удаление постоянных результатов в постоянных по-прежнему доступны

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

Другие вопросы по тегам