"base.send: include, InstanceMethods" ---> Что это делает?
Я смотрю модуль X, который содержит два модуля под названием "InstanceMethods
" и "ClassMethods
".
Последнее определение в модуле X таково:
def self.included(base)
base.send :include, InstanceMethods
base.send :extend, ClassMethods
end
Что это делает?
Ответы
Ответ 1
included
вызывается всякий раз, когда модуль входит в другой модуль или класс. В этом случае он попытается вызвать метод base
include
, чтобы получить методы модуля, переменные и константы из InstanceMethods
, добавленные в base
, а затем попытается вызвать метод base
extend
, чтобы получить экземпляр методы из ClassMethods
добавлены в base
.
Он также мог быть
def self.included( base )
base.include( InstanceMethods )
base.extend( ClassMethods )
end
Ответ 2
'send' вызывает свой первый аргумент как метод для объекта, на который его вызывал, а остальные аргументы отправляются как аргументы метода. Итак, в этом случае
base.send :include, InstanceMethods
эквивалентно
base.include(InstanceMethods)
Что добавляет методы в модуле InstanceMethods к объекту "base"
Ответ 3
Он определяет метод класса, который принимает параметр "base
". Затем он вызывает методы include
и extend
на base
, передавая соответственно модули InstanceMethods
и ClassMethods
. Вызов include
добавит методы экземпляра, определенные в InstanceMethods
- base
. Я не знаком с методом extend
, но я предполагаю, что он тоже сделает что-то подобное, но для методов класса.