4
Ruby имеет method_missing
, Python имеет getattr
. Предлагает ли Boo что-то, что я могу использовать для перехвата вызовов метода?Как перехватить вызов метода в Boo?
Ruby имеет method_missing
, Python имеет getattr
. Предлагает ли Boo что-то, что я могу использовать для перехвата вызовов метода?Как перехватить вызов метода в Boo?
Да, Boo имеет IQuackFu.
В принципе, вы реализуете IQuackFu
, который имеет три метода:
QuackGet
: вызывается, когда вы получаете значение свойстваQuackSet
вызывается, когда вы установите значение свойстваQuackInvoke
: вызывается при вызове методаАдрес an example.
Небольшой вопрос: может ли Boo перехватить вызовы других объектов? Похоже, что Groovy делает с метаклассом. Я думаю, что ответ отрицательный, поскольку он статически напечатан, но я бы хотел быть уверен. – Geo
Я не думаю, что вы можете сделать это так же, как Groovy, но вы можете использовать класс с поддержкой IQuackFu для обертывания/украшения другого класса. Класс IQuackFu может иметь словарь методов и свойств для реализации expando-поведения. –
Boo не является действительно динамичным, как groovy, вы не можете изменить определение типа во время выполнения. Если вы объявляете переменную как «утку», она по существу делает магию компилятора, чтобы превратить ее в позднюю привязку к этому объекту, которая будет протекать через IQuackFu, если она доступна. В Boo нет реального метакласса. Вам понадобится IronRuby или IronPython, чтобы получить нечто большее, чем метакласс. –