我知道我可以导入 instance_methods,但是可以导入类方法吗?如何导入?
问问题
301 次
2 回答
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"
InstanceMethods 模块有什么用?
当我需要模块在我的类中包含实例和类方法时,我使用两个子模块。通过这种方式,方法被整齐地分组,例如,可以在代码编辑器中轻松折叠。
感觉也比较“统一”:两种方法都是从self.included
hook中注入的。
无论如何,这是个人喜好的问题。此代码的工作方式完全相同:
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
于 2013-01-11T15:16:40.187 回答
2
简短的回答是:不,您不能使模块对象本身的方法(模块的“类”方法)位于另一个对象的继承链中。@Sergio 的答案是一种常见的解决方法(通过将“类”方法定义为另一个模块的一部分)。
您可能会发现以下图表具有指导意义(点击查看完整尺寸或获取 PDF):
(来源:phrogz.net)
注意:此图尚未针对 Ruby 1.9 进行更新,其中有额外的核心对象BasicObject
,例如稍微改变根流。
于 2013-01-11T15:48:05.750 回答