通过在使用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 #