Интересно, можно ли получить список классов, полученных из заданного Class
.Получить список классов, полученных из данного класса
Я вижу, есть обратный вызов Class::inherited
, который должен быть Есть две проблемы, связанные с этим подходом «вызывается всякий раз, когда подкласс текущего класса создается.»:
- Когда я не продюсер из этого класса (я сказал, что я должен обезвредить его), я не могу вообще убедиться, что мой monkeypatch будет применяться до того, как будет создан первый производный класс.
- В идеальном мире я бы получил список классов, несмотря на то, были ли они уже инициализированы или нет, а обратный вызов должен называться фактически при создании экземпляра класса.
Я понимаю, что RTTI, вероятно, не лучший способ получить необходимую мне информацию (из-за вышеприведенного выше). Кто-нибудь предложит другой подход? Анализ статического кода? Все, что?
Я бы очень признателен за любые идеи. Скажем, у меня есть весь код, представляющий интерес в моей директории (другими словами, я заинтересован в моих классов, полученных только из некоторого заранее определенного класса, например, ApplicationController
s в мое приложение Rails.)
Upvote для предоставления мне уведомления о 'TracePoint', но этот код, к сожалению, работает (как код в любом другом ответе здесь) только тогда, когда механизм загрузки классов известен и предсказуем. Последнее, например, не относится к Rails. – mudasobwa
Привет @mudasobwa Я попробовал его с рельсов, вот мой результат - ActiveRecord :: Base подклассам PaperTrail :: Версия, PaperTrail :: VersionAssociation и все мои модели ... Просто добавьте его на boot.rb –
@mudasobwa, поэтому он должен работать с непредсказуемым контекстом, если вы можете потребовать этот файл перед инициализацией остальной части файлов. TracePoint отлично работает, он не требует инициализации класса, только триггеры определения: событие класса и т. Д. Сообщите мне, если у вас есть какой-либо конкретный вопрос, который, возможно, пропустил –