По той же причине, о которой упоминал Питер, я хотел бы добавить пример, чтобы новичкам-разработчикам было легко понять self.included (base) и self.extended (base ) :
module Module1
def fun1
puts "fun1 from Module1"
end
def self.included(base)
def fun2
puts "fun2 from Module1"
end
end
end
module Module2
def foo
puts "foo from Module2"
end
def self.extended(base)
def bar
puts "bar from Module2"
end
end
end
class Test
include Module1
extend Module2
def abc
puts "abc form Test"
end
end
Test.new.abc # => abc form Test
Test.new.fun1 # => fun1 из Module1
Test.new.fun2 # => fun2 из Module1
Test.foo # => foo из Module2
Test.bar # => бар из Module2
extend: методы будут доступны как методы класса
include: методы будут доступны как методы экземпляра
" base " в self.extended ( base ) / self.included ( base ):
Базовым параметром в статическом расширенном методе будет либо объект экземпляра, либо объект класса класса, который расширил модуль в зависимости от того, расширяете ли вы объект или класс, соответственно.
Когда класс включает модуль, вызывается метод self.included модуля. Базовым параметром будет объект класса для класса, в который входит модуль.