remove_const и имя модуля - PullRequest
       19

remove_const и имя модуля

0 голосов
/ 12 декабря 2018

В стандартной документации Ruby для remove_const, я заметил эту строку:

Если эта константа ссылается на модуль, это не изменит имя этого модуля и может привестидо путаницы.

Что это значит?Какое отношение имеет удаление / выгрузка константы к именам модулей?О какой путанице это говорит?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Имя модуля устанавливается автоматически, когда модуль назначается константе в первый раз.Но он не получает автоматически unset , когда модуль не назначен.Это может сбивать с толку.

См .:

a = Module.new
a.name    #=> nil
a.to_s    #=> '#<Module:0x00007f91b38625f8>'
a.inspect #=> '#<Module:0x00007f91b38625f8>'

A = a
a.name    #=> 'A'
a.to_s    #=> 'A'
a.inspect #=> 'A'

B = a
B.name    #=> 'A'
B.to_s    #=> 'A'
B.inspect #=> 'A'

self.class.send(:remove_const, :A)
a = nil
B.name    #=> 'A'
B.to_s    #=> 'A'
B.inspect #=> 'A'

Теперь вы можете ссылаться на модуль только через константу B, но имя модуля по-прежнему A,которая является первой константой, которой она когда-либо была назначена.Удаление константы не изменит и / или не удалит имя модуля.

0 голосов
/ 12 декабря 2018

Если модуль определен с именем A,

module A; end
a = A

, тогда его имя "A", поэтому вы можете назвать его как A (по его имени):

a.name # => "A"
A # => A

Но если вы не определите A:

self.class.send(:remove_const, :A)

, вы больше не сможете звонить A:

A # >> NameError: uninitialized constant A

, но его имя останется "A":

a.name # => "A"
a # => A

Это, вероятно, то, что подразумевается под путаницей.

...