Ответ 1
Вот практический пример.
class MyClass
include MyModule
end
Когда вы включите модуль в класс, будет вызван крюк included
. Поэтому second_class_method
будет вызываться в рамках Class
.
Что происходит здесь,
-
first_method
иsecond_method
включены в качестве примеров-методовMyClass.
instance = MyClass.new instance.first_method # => whatever returned value of first_method is
-
Методы
ClassMethods
автоматически смешиваются как методы классаMyClass
. Это обычный шаблон Ruby, которыйActiveSupport::Concern
инкапсулирует. Код Ruby без Railsmodule MyModule def self.included(base) base.extend ClassMethods end module ClassMethods def this_is_a_class_method end end end
В результате получается
MyClass.this_is_a_class_method
или в вашем случае
MyClass.first_class_method
-
included
- это крючок, который эффективно соответствует следующему коду# non-Rails version module MyModule def self.included(base) base.class_eval do # somecode end end end # Rails version with ActiveSupport::Concerns module MyModule included do # somecode end end
В основном это "синтаксический сахар" для общих паттернов. Что происходит на практике, так это то, что при смешивании модуля этот код выполняется в контексте класса микшера.