Хотите знать, как 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 гарантирует, что методы выполняются в привязке объекта.