通过在使用ActiveSupport :: Concernfunction时将“嵌套”模块包含为该类的实例方法,如何将方法添加到类中?

我正在使用Ruby 1.9.2和Ruby on Rails v3.2.2 gem。 在我之前关于如何在使用Ruby on Rails ActiveSupport :: Concernfunction时 “嵌套”模块的问题之后 ,我想了解我应该通过包含“嵌套”模块来添加到类中的方法,以便制作这个类的实例方法 。 也就是说,我有以下几点:

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 

我应该在MyModuleB的“body”/“context”/“scope”中声明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 # 

ActiveSupport :: Concern只是通过自动包含一个名为ClassMethods的模块并在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 #