使用ActiveSupport::Concern功能时,如何通过将"nested"模块包含在类中作为该类的实例方法来添加到类中?



我正在使用Ruby 1.9.2,而Ruby在Rails v3.2.2 Gem上。在我上一次有关如何"嵌套"在Rails ActiveSupport ::关注功能时"嵌套"模块包含的问题之后,我想了解我应该在何处陈述在类中添加到类中的方法,以包括"嵌套"模块以制作该类的这些实例方法。也就是说,我有以下内容:

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

i应该在 MyModuleB的"正文"/" context"/"范围"中状态 def my_method ... end还是我应该在 included do ... end块中说明?有什么区别和我应该从中期待什么?

模块中混合的方法是该类上的实例方法。将它们放在included块中可能会起作用,但无需这样做。通过扩展,这可以与模块一起使用,因为您可以在ModuleA中包含ModuleB,其所有实例方法将成为ModuleA上的实例方法,并且一旦ModuleA包括在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 ::关注的问题只是通过自动包括一个名为 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>

最新更新