Szukaj…


Składnia

  • Deklaracja

    module Name;
    
        any ruby expressions;
    
    end
    

Uwagi

Nazwy modułów w Rubim są stałymi, więc muszą zaczynać się od dużej litery.

module foo; end # Syntax error: class/module name must be CONSTANT

Prosty mixin z włączeniem

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

Teraz Bar jest mieszanką własnych metod i metod SomeMixin .

Zauważ, że użycie mixinu w klasie zależy od tego, jak zostanie dodany:

  • słowo kluczowe include ocenia kod modułu w kontekście klasy (np. definicje metod będą metodami w instancjach klasy),
  • extend ocenia kod modułu w kontekście klasy singleton obiektu (metody są dostępne bezpośrednio na rozszerzonym obiekcie).

Moduł jako przestrzeń nazw

Moduły mogą zawierać inne moduły i klasy:

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

Prosty mixin z rozszerzeniem

Mixin to tylko moduł, który można dodać (wmieszać) do klasy. jednym ze sposobów jest skorzystanie z metody ext. extend metoda dodaje metod wstawek jako metody klasy.

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 

Moduły i skład klas

Za pomocą modułów możesz budować bardziej złożone klasy poprzez kompozycję . Dyrektywa include ModuleName zawiera metody modułu w klasie.

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 zawiera teraz metody z Foo i Bar oprócz własnych metod.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow