Ruby Language
Модули
Поиск…
Синтаксис
декларация
module Name; any ruby expressions; end
замечания
Имена модулей в Ruby являются константами, поэтому они должны начинаться с заглавной буквы.
module foo; end # Syntax error: class/module name must be CONSTANT
Простой миксин с включением
module SomeMixin
def foo
puts "foo!"
end
end
class Bar
include SomeMixin
def baz
puts "baz!"
end
end
b = Bar.new
b.baz # => "baz!"
b.foo # => "foo!"
# works thanks to the mixin
Теперь Bar
представляет собой сочетание своих собственных методов и методов от SomeMixin
.
Обратите внимание, что использование mixin в классе зависит от того, как он добавляется:
- ключевое слово
include
оценивает код модуля в контексте класса (например, определения метода будут методами для экземпляров класса), -
extend
будет оценивать код модуля в контексте одноэлементного класса объекта (методы доступны непосредственно на расширенном объекте).
Модуль как пространство имен
Модули могут содержать другие модули и классы:
module Namespace
module Child
class Foo; end
end # module Child
# Foo can now be accessed as:
#
Child::Foo
end # module Namespace
# Foo must now be accessed as:
#
Namespace::Child::Foo
Простой миксин с удлиненным
Mixin - это просто модуль, который можно добавить (смешанный) в класс. один способ сделать это - с помощью метода расширения. Метод extend
добавляет методы mixin как методы класса.
module SomeMixin
def foo
puts "foo!"
end
end
class Bar
extend SomeMixin
def baz
puts "baz!"
end
end
b = Bar.new
b.baz # => "baz!"
b.foo # NoMethodError, as the method was NOT added to the instance
Bar.foo # => "foo!"
# works only on the class itself
Модули и класс композиций
Вы можете использовать Модули для создания более сложных классов с помощью композиции . include ModuleName
директива include ModuleName
включает методы модуля в класс.
module Foo
def foo_method
puts 'foo_method called!'
end
end
module Bar
def bar_method
puts 'bar_method called!'
end
end
class Baz
include Foo
include Bar
def baz_method
puts 'baz_method called!'
end
end
Baz
теперь содержит методы как Foo
и Bar
в дополнение к своим собственным методам.
new_baz = Baz.new
new_baz.baz_method #=> 'baz_method called!'
new_baz.bar_method #=> 'bar_method called!'
new_baz.foo_method #=> 'foo_method called!'