Поиск…


Синтаксис

  • декларация

    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!'


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow