Страницы

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

воскресенье, 12 января 2020 г.

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

#ruby


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


Ответы

Ответ 1



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 просто штатно продолжит свою работу.

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

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