Bac*_*cko 2 ruby methods nested module ruby-on-rails
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我应该def my_method ... end在"身体"/"上下文"/"范围"中说明,MyModuleB或者我应该在included do ... end块中说明?有什么区别,我应该从中得到什么?
混合到类中的模块中的方法成为该类的实例方法.虽然将它们放入included块中可能会起作用,但是没有必要这样做.通过扩展,这可以与模块一起使用,因为你可以包含ModuleBin 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>
Run Code Online (Sandbox Code Playgroud)
ActiveSupport :: Concern通过自动包含一个名为的模块ClassMethods并included在include 类的上下文中运行块来解决这个问题,所以相应的是:
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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1031 次 |
| 最近记录: |