Удаление постоянных результатов в постоянных по-прежнему доступны - PullRequest
0 голосов
/ 20 мая 2018

Убедитесь, что 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 Ответ

0 голосов
/ 20 мая 2018

Теперь, как в следующих примерах возвращается константа Object, если она удалена?

Нет.Они не могут .Константы не являются объектами в Ruby, поэтому они не могут возвращать ::Object константу.

Они могут , однако возвращают объект, который реагирует на inspect со строкой 'Object'.Объект, который оказывается тем же объектом, на который раньше ссылалась теперь удаленная ::Object константа.

Удаление константы удаляет константу.Ничего более.В частности, не не удаляет объект, на который ссылается константа. IFF эта константа была только ссылкой на этот объект, THEN этот объект теперь будет иметь право на сборку мусора.Но это не тот случай: константа ::Object не является единственной ссылкой на класс Object, поскольку каждый подкласс класса Object имеет ссылку на класс Object в своем указателе superclass икаждый экземпляр класса Object имеет ссылку на класс Object в своем указателе class.Кроме того, внутренние структуры данных механизма выполнения могут иметь или не иметь ссылки на класс Object.

Следовательно, класс Object почти никогда не будет собирать мусор, и у вас всегда будут какие-то ссылкик нему, с помощью которого вы можете получить к нему доступ, например, ''.class.superclass даст вам доступ к классу Object независимо от того, существует ли константа ::Object.

Короче говоря: вы путаетеконстанта ::Object с объектом, на который ссылается эта константа.Это распространенная ошибка новичка.Однако различие между названием вещи и самой вещью является фундаментальным почти во всех языках программирования.

...