Ответ 1
Честно говоря, я использовал 1-ю форму (повторное открытие класса), поскольку она кажется более естественной, но ваш вопрос заставил меня провести некоторое исследование по этому вопросу и вот результат.
Проблема с повторным открытием класса заключается в том, что он будет молча определять новый класс, если исходный, который вы намеревались повторно открыть, по какой-то причине не был определен на данный момент. Результат может быть другим:
-
Если вы не переопределяете какие-либо методы, а только добавляете новые, и определяется исходная реализация (например, файл, где первоначально задан класс), все будет нормально.
-
Если вы переопределите некоторые методы и оригинал будет загружен позже, ваши методы будут переопределены исходными версиями.
-
Самый интересный случай - когда вы используете стандартную автозагрузку или какой-то причудливый механизм перезагрузки (например, тот, который используется в Rails) для загрузки/перезагрузки классов. Некоторые из этих решений полагаются на const_missing, который вызывается, когда вы ссылаетесь на константу undefined. В этом случае механизм автозагрузки пытается найти определение undefined class и загрузить его. Но если вы определяете класс самостоятельно (пока вы планируете повторно открыть уже определенный), он больше не будет "отсутствовать", и оригинал может никогда не загружаться вообще, поскольку механизм автозагрузки не будет запущен.
С другой стороны, если вы используете class_eval
, вы будете немедленно уведомлены, если класс не определен в данный момент. Кроме того, поскольку вы ссылаетесь на класс, когда вы вызываете его метод class_eval
, любой механизм автозагрузки будет иметь возможность определить определение класса и загрузить его.
Имея это в виду class_eval
, кажется, лучший подход. Хотя, я был бы рад услышать какое-то другое мнение.