2017-02-15 2 views
0

Скажем, у меня есть гипотетический камень, my_gem, который определяет класс AwesomeClass, и драгоценный камень включает в себя бинарный файл, который будет только работа по AwesomeClass, но будет нагрузка любой код в моем lib/ каталог, скажем. Я хочу чисто расширить некоторые методы класса, иногда называя эквивалент super.Расширение класса, определенного в гем

Скажем, это выглядит следующим образом:

class AwesomeClass 
     def cool_method 
     ... 
     end 
    end 

И здесь, в моем коде библиотеки, я хочу сделать что-то вроде:

AwesomeClass.class_eval 
     def cool_method 
     (call the original method here) 
     ... 
     end 
    end 

Как бы вы сделать это? Есть alias мой единственный реальный вариант? Есть ли какой-то лучший способ, который я пропускаю? Что-то кроме class_eval?

ответ

1

Является ли мой единственный реальный вариант?

Да, если вы хотите открыть и непосредственно изменить класс. Однако лучшим вариантом является не открытие сторонних классов и обезвреживание их. Вы должны либо использовать наследование, либо состав: Создайте свой собственный класс, который обертывает экземпляр AwesomeClass, предоставляет свой собственный cool_method, который вызывает метод AwesomeClass плюс любые дополнительные функции, которые вам нужны.

+0

Как вы видите, что работаете, если камень только когда-либо хочет «AwesomeClass», а не мой? –

+1

@ DanielBogan Затем Gem построен неправильно, это не значит, что система типа Ruby предназначена для работы. Пока ваш объект поддерживает тот же метод, что и вызов 'AwesomeClass', камень не должен его отклонять. – meagar

+0

Да, это имеет смысл. Ладно, рад, спасибо! –

Смежные вопросы