我知道我可以导入instance_methods,但是可以导入类方法,以及如何导入?
答案 0 :(得分:4)
一个常见的习语是:
module Bar
# object model hook. It's called when module is included.
# Use it to also bring class methods in by calling `extend`.
def self.included base
base.send :include, InstanceMethods
base.extend ClassMethods
end
module InstanceMethods
def hello
"hello from instance method"
end
end
module ClassMethods
def hello
"hello from class method"
end
end
end
class Foo
include Bar
end
Foo.hello # => "hello from class method"
Foo.new.hello # => "hello from instance method"
当我需要模块在我的类中包含实例和类方法时,我使用了两个子模块。通过这种方式,方法可以整齐地分组,例如,可以在代码编辑器中轻松折叠。
它也感觉更“均匀”:两种方法都是从self.included
钩子注入的。
无论如何,这是个人偏好的问题。此代码的工作原理完全相同:
module Bar
def self.included base
base.extend ClassMethods
end
def hello
"hello from instance method"
end
module ClassMethods
def hello
"hello from class method"
end
end
end
答案 1 :(得分:2)
简短的回答是:不,你不能使模块对象本身的方法(模块的“类”方法)在另一个对象的继承链中。 @ Sergio的答案是一个常见的解决方法(通过将“类”方法定义为另一个模块的一部分)。
您可能会发现以下图表具有指导性(点击查看完整尺寸或get the PDF):
Ruby Method Lookup Flow http://phrogz.net/RubyLibs/RubyMethodLookupFlow.png
注意:此图尚未针对Ruby 1.9进行更新,其中还有其他核心对象,如BasicObject
,稍微改变了根流。 < / p>