#ruby
#ruby
Вопрос:
Пожалуйста, объясните, почему self
используется def self.included (klass)
ниже.
module A
def self.included(klass)
puts "A -> #{klass}"
puts A
puts self
end
end
class X
include A
end
Ответ №1:
При написании def self.included
вы определяете метод, который является частью одноэлементного класса модуля A. Как правило, одноэлементные методы могут быть вызваны только путем выполнения A.included()
но этот одноэлементный метод имеет специальное имя included
, которое вызывает вызов интерпретатора Ruby, когда модуль включается в класс.
Обычный метод в модуле (определенный с помощью def foo
) может быть вызван только в том случае, если модуль включается во что-то другое.
Ответ №2:
Вот как вы объявляете метод модуля, который может быть вызван напрямую. Обычно методы, определенные в модуле, можно использовать, только если они включены в другой класс или модуль, как класс X в этом примере.
module Example
def self.can_be_called
true
end
def must_be_included
true
end
end
В этом случае вы увидите следующие результаты:
Example.can_be_called
# => true
Example.must_be_included
# => NoMethodError: undefined method `must_be_included' for Example:Module
self
Однако объявленные методы не объединяются с классами или модулями, которые их включают. Таким образом, они предназначены для специального использования.