サーチ…


構文

  • 宣言

    module Name;
    
        any ruby expressions;
    
    end
    

備考

Rubyのモジュール名は定数なので、大文字で始める必要があります。

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

シンプルなmixinと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は、独自のメソッドとSomeMixinのメソッドをSomeMixinです。

ミックスインがクラスでどのように使用されるかは、それがどのように追加されるかによって異なります。

  • 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は、クラスに追加(混合)できる単なるモジュールです。これを行う1つの方法はextendメソッドです。 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ディレクティブは、モジュールのメソッドをクラスに組み込みます。

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は、独自のメソッドに加えてFooBar両方のメソッドが含まれています。

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