2

私はRuby1.9.2とRubyonRailsv3.2.2gemを使用しています。Ruby on Rails ActiveSupport :: Concern機能を使用するときにモジュールを「ネスト」する方法についての前の質問の後、「ネストされた」モジュールを含めることによってクラスに追加されたメソッドをどこに記述すべきかを理解したいと思います。そのクラスのこれらのインスタンスメソッド。つまり、私は次のものを持っています:

class MyClass < ActiveRecord::Base
  include MyModuleA
end

module MyModuleA
  extend ActiveSupport::Concern

  included do
    include MyModuleB
  end
end

module MyModuleB
  extend ActiveSupport::Concern

  included do
    # def my_method
    #   ...
    # end
  end

  # def my_method
  #   ...
  # end
end

def my_method ... endの「本体」/「コンテキスト」/「スコープ」に記載する必要がありますか、それともブロックMyModuleBに記載する必要がありますか違いは何ですか、そして私はそれから何を期待すべきですか?included do ... end

4

1 に答える 1

5

クラスに混在するモジュール内のメソッドは、そのクラスのインスタンスメソッドになります。それらをブロックに入れることincludedはおそらくうまくいくでしょうが、それをする必要はありません。ModuleBこれは、拡張により、モジュールで機能します。これは、に含めることができ、ModuleAそのすべてのインスタンスメソッドがのインスタンスメソッドになりModuleAModuleAクラスFooに含まれると、そのすべてのインスタンスメソッド(から混合されたものを含むB)がFooのインスタンスメソッドになるためです。

「従来の」ミックスインは次のようになります。

module Mixin
  def self.included(klass)
    klass.send :extend, ClassMethods
    klass.some_class_method
  end

  module ClassMethods
    def some_class_method
      puts "I am a class method on #{self.inspect}"
    end
  end

  def some_instance_method
    puts "I am an instance method on #{self.inspect}"
  end
end

class Foo
  include Mixin
end

Foo.new.some_instance_method

# Output:
# I am a class method on Foo
# I am an instance method on #<Foo:0x00000002b337e0>

ActiveSupport :: Concernは、名前の付いたモジュールを自動的にインクルードし、インクルードクラスのコンテキストでブロックをClassMethods実行することで、これを少しだけ装います。したがって、同等のものは次のとおりです。included

module Mixin
  extend ActiveSupport::Concern

  included do
    some_class_method
  end

  module ClassMethods
    def some_class_method
      puts "I am a class method on #{self.inspect}"
    end
  end

  def some_instance_method
    puts "I am an instance method on #{self.inspect}"
  end
end

class Foo
  include Mixin
end

Foo.new.some_instance_method

# Output:
# I am a class method on Foo
# I am an instance method on #<Foo:0x000000034d7cd8>
于 2012-10-28T16:45:33.093 に答える