我正在使用 Ruby 1.9.2 和 Ruby on Rails v3.2.2 gem。在我上一个问题之后使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌套”模块的包含 https://stackoverflow.com/questions/13110306/how-to-nest-the-inclusion-of-modules-when-using-the-ruby-on-rails-activesuppor,我想了解我应该在哪里通过包含“嵌套”模块来声明添加到类中的方法,以便使这些实例方法那个班级的。也就是说,我有以下内容:
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
Should我声明def my_method ... end
在“主体”/“上下文”/“范围”中MyModuleB
或者我应该指出included do ... end
block? 有什么区别以及我应该从中期待什么?
混合到类中的模块中的方法成为该类的实例方法。当将它们放入included
block 可能会起作用,但没有必要这样做。通过扩展,这适用于模块,因为您可以包括ModuleB
in ModuleA
并且它的所有实例方法都成为实例方法ModuleA
,还有一次ModuleA
包含在课程中Foo
,它的所有实例方法(包括那些混合在 fromB
) 成为 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)