Страницы

Поиск по вопросам

среда, 6 марта 2019 г.

Как узнать имя метода следующего после объявления некоторой структуры данных

Здравствуйте, сегодня наткнулся на интересный Ruby гем Contracts, как он работает и его исходный код можно посмотреть тут. И у меня появился вопрос, как это гем достает имя следующего после Contract ... => ... метода, исходный код проекта не дал мне ответов (возможно я не там искал).


Ответ

Cредствами мета-программирования гем вмешивается в процесс определения каждого из инстанс-методов класса.
Обратите внимание на файл lib/contracts/decorators.rb в нем переопределен метод method_added(), который вызывается, когда вы определяете метод при помощи конструкции def
def method_added(name) MethodHandler.new(name, false, self).handle super end
Метод принимает параметр name с именем определяемого метода, вы сначала выполняете контракт и лишь затем вызываете оригинальный метод super, который осуществляет определение метода. Если контракт вызовет исключение (raise) - до определения метода дело даже не дойдет. Если контракт действительный или его нет, то Module#method_added просто штатно продолжит свою работу.

Комментариев нет:

Отправить комментарий