Предположим, что я делаю модуль следующим образом:
m = Module.new do
class C
end
end
Три вопроса:
Кроме ссылки на m
, есть ли способ, которым я могу получить доступ C
и другие вещи внутри m
?
Я могу дать имя анонимному модулю после того, как я создал его (так же, как если бы я ввел "модуль...")?
Как я удаляю анонимный модуль, когда я сделан с ним, такой, что константы, которые он, больше определяет не присутствуют?
Три ответа:
Да, используя ObjectSpace
. Этот код заставляет c
ссылаться на ваш класс C
без ссылки на m
:
c = nil
ObjectSpace.each_object {| obj |
c = obj if (Класс === obj и имя объекта = ~ / :: C $ /)
}
Конечно, это зависит от того, что в программе нет других классов с именем C
, но идею вы поняли.
Да, вроде того. Если вы просто назначите его константе, например M = m
, тогда m.name
вернет «M»
вместо nil
, и ссылки наподобие M :: C
будут работать. На самом деле, когда я делаю это и набираю M :: C
в irb, я получаю #
, но, возможно, это ошибка.
m
или C
, и m
] устанавливается на другое значение или выходит за рамки. Если вы присвоили его константе, как в предыдущем пункте, вам также нужно будет изменить его на другое значение (хотя изменение констант обычно не рекомендуется).