Работа с анонимными модулями в Ruby

Предположим, что я делаю модуль следующим образом:

m = Module.new do
  class C
  end
end

Три вопроса:

  • Кроме ссылки на m, есть ли способ, которым я могу получить доступ C и другие вещи внутри m?

  • Я могу дать имя анонимному модулю после того, как я создал его (так же, как если бы я ввел "модуль...")?

  • Как я удаляю анонимный модуль, когда я сделан с ним, такой, что константы, которые он, больше определяет не присутствуют?

5
задан Byron Park 21 May 2010 в 15:18
поделиться

1 ответ

Три ответа:

  • Да, используя 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, я получаю # :: C , но, возможно, это ошибка.

  • Я считаю, что его следует собирать сборщиком мусора, если на него нет ссылок, т.е. когда нет экземпляров или подтипов m или C , и m ] устанавливается на другое значение или выходит за рамки. Если вы присвоили его константе, как в предыдущем пункте, вам также нужно будет изменить его на другое значение (хотя изменение констант обычно не рекомендуется).
7
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: