27
LESSON 4: METHOD_MISSING AND ITS FRIENDS DYNAMIC RUBY

Dynamic Ruby. Lesson #4: method_missing and its friends

Embed Size (px)

Citation preview

LESSON 4: METHOD_MISSING AND ITS FRIENDS

DYNAMIC RUBY

RUBY METHOD LOOKUP

RUBY METHOD LOOKUP

ruby method lookup

RUBY METHOD LOOKUP

RUBY METHOD LOOKUP

Поскольку подключаемые модули образовывают цепочку наследования, мы можем обращаться к одноименным методам суперкласса через метод super.

RUBY METHOD LOOKUP

PREPEND

PRETEND

prepend позволяет нарушить классический механизм наследования объектов, определив подключаемому модулю больший приоритет, чем классу как таковому.

respect my authority*

* иначе статья 148 УК РФ

PRETEND

METHOD_MISSING

METHOD_MISSING

method_missing

METHOD_MISSING

method_missing это приватный метод, определенный еще на уровне BasicObject. В этой реализации он просто вызывает исключение NoMethodError.

METHOD_MISSING

METHOD_MISSING

Хм. Раз method_missing это просто инстанс метод BasicObject, значит его можно переопределить в дочерних классах.

METHOD_MISSING

RESPOND_TO_MISSING?

RESPOND_TO_MISSING?

Сложно искать черную кошку в темной комнате.

Особенно, если ее там нет.

RESPOND_TO_MISSING?

DELEGATORS

DELEGATORS

Как можно использовать мощь method_missing? Например, при создании делегаторов (на самом деле ruby имеет хорошие встроенные механизмы делегирования, такие как модуль Forwardable и класс SimpleDelegator, но нам важно показать возможности method_missing).

DELEGATORS

BLOCKS, PROCS AND LAMBDAS

REFERENCES

▸ https://blog.jcoglan.com/2013/05/08/how-ruby-method-dispatch-works/

▸ http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html

▸ https://makandracards.com/makandra/23171-how-ruby-method-lookup-works

▸ http://blog.marc-andre.ca/2010/11/15/methodmissing-politely/

▸ https://habrahabr.ru/post/269785/

THANK YOU!

Alex Mikitenko [email protected] https://github.com/nonkor

TO BE CONTINUED…