Хотите знать, как Ruby находит и выполняет метод?

Введение в метод

Первым делом расскажите о методах. Я говорю, какие есть методы. Ruby - чистый объектно-ориентированный язык. Это означает, что все является объектом; даже методы есть.

Основная философия объектной ориентации - «передача сообщений».

ООП для меня означает только обмен сообщениями. - Алан Кей

Итак, в основном methods - это сообщения, которые вы передаете объектам.

Определение метода во время компиляции

Когда встречается код определения класса (class [ClassName]), Ruby создает экземпляр объекта Class class с указанным вами именем ClassName. И методы, которые вы определили, будут определены внутри определения ClassName. то есть методы будут в чертеже класса. При желании вы можете позже щипать методы.

Однако @instancevariables хранятся в объекте, которому они принадлежат. И определяется только при вызове определяющего метода. т.е. если функция-конструктор предназначена для определения @instance_var, тогда var будет определен во время построения; иначе не будет.

Поиск метода

В приведенном выше примере, когда вы вызываете cow.speak, Ruby будет искать в объекте cow singleton методы, называемые speak, если не найдены, будет искать Cow метод в классе Cow. Если по-прежнему его нет, выполните поиск модуля Printable, потому что он находится в цепочке superclass / предков. Он продолжает пузыриться, пока не найдет метод.

MySubclass.ancestors # => [MySubclass, MyClass, Object, Kernel, BasicObject]

С точки зрения объектно-ориентированного подхода, в основном это поиск, должен ли этот объект отвечать на это конкретное сообщение; Если да, то как?

Если объект не может ответить, вызывается BasicObject#method_missing method. Вы можете переопределить, что делать в этом случае для вашего объекта.

Если один и тот же метод определен как в дочернем, так и в родительском, то приоритет ниже по иерархии. Значит, он старается как можно быстрее вернуться с поиска. Если вы хотите вызвать метод, определенный в родительском элементе, используйте метод super.

Выполнение метода

Выполнить найденный метод немного сложно. Найденный метод может иметь упоминания о переменных @instance. И вы знаете, что переменные @instance хранятся в объектах. Итак, Ruby гарантирует, что методы выполняются в привязке объекта.