繁体   English   中英

使用ActiveSupport :: Concern功能时,如何通过包括“嵌套”模块作为该类的实例方法来使添加到类中的方法成为现实?

[英]How to make methods added to a class by including “nested” modules to be instance methods of that class when using the ActiveSupport::Concern feature?

我正在使用Ruby 1.9.2和Ruby on Rails v3.2.2 gem。 在我上一个关于使用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块? 有什么区别,我应该从中期待什么?

混入一个类的模块中的方法将成为该类的实例方法。 尽管将它们放在included块中可能会起作用,但是没有必要这样做。 通过扩展,它可以与模块一起使用,因为您可以将ModuleB包含在ModuleA并且其所有实例方法都将成为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 :: Concern通过自动包含一个名为ClassMethods的模块,并在包含类的上下文中运行included块,从而使这一点ClassMethods 。因此,等效项是:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM