Ricerca…


Sintassi

  • Dichiarazione

    module Name;
    
        any ruby expressions;
    
    end
    

Osservazioni

I nomi dei moduli in Ruby sono costanti, quindi devono iniziare con una lettera maiuscola.

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

Un semplice mixin con include

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

Now Bar è un mix dei suoi metodi e dei metodi di SomeMixin .

Si noti che il modo in cui un mixin viene utilizzato in una classe dipende da come viene aggiunto:

  • la parola chiave include valuta il codice del modulo nel contesto della classe (ad esempio, le definizioni del metodo saranno metodi sulle istanze della classe),
  • extend il codice del modulo nel contesto della classe singleton dell'oggetto (i metodi sono disponibili direttamente sull'oggetto esteso).

Modulo come spazio dei nomi

I moduli possono contenere altri moduli e classi:

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

Un semplice mixin con estensione

Un mixin è solo un modulo che può essere aggiunto (mescolato in) a una classe. un modo per farlo è con il metodo estendere. Il metodo di extend aggiunge metodi del mixin come metodi di classe.

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 

Moduli e composizione di classe

È possibile utilizzare i moduli per creare classi più complesse attraverso la composizione . La direttiva include ModuleName incorpora i metodi di un modulo in una classe.

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 ora contiene metodi di Foo e Bar oltre ai propri metodi.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow