#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 просто штатно продолжит свою работу.
Комментариев нет:
Отправить комментарий