Sök…


Syntax

  • Deklaration

    module Name;
    
        any ruby expressions;
    
    end
    

Anmärkningar

Modulnamn i Ruby är konstanter, så de måste börja med en stor bokstav.

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

En enkel mixin med inkludera

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

Nu är Bar en blandning av sina egna metoder och metoderna från SomeMixin .

Observera att hur en mixin används i en klass beror på hur den läggs till:

  • nyckelordet include utvärderar modulkoden i klassens sammanhang (t.ex. metoddefinitioner kommer att vara metoder i klassens instanser),
  • extend kommer att utvärdera modulkoden i samband med singletonklassen för objektet (metoder finns tillgängliga direkt på det utvidgade objektet).

Modul som namnutrymme

Moduler kan innehålla andra moduler och klasser:

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

En enkel mixin med förlängning

En mixin är bara en modul som kan läggas till (mixas in) i en klass. ett sätt att göra det är med förlängningsmetoden. extend lägger till blandningsmetoder som klassmetoder.

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 

Moduler och klassens sammansättning

Du kan använda moduler för att bygga mer komplexa klasser genom komposition . Direktivet om include ModuleName innehåller en moduls metoder i en klass.

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 innehåller nu metoder från både Foo och Bar utöver sina egna metoder.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow