我想调用与类方法相同的模块方法以及Ruby类中的实例方法。例子
module Mod1
def method1
end
end
class A
end
我想像这样调用method1
A.new.method1
或
A.method1
。
答案 0 :(得分:2)
如@Karthik所述,您可以将模块include
和extend
用作模块:
module Mod1
def method1
'hi'
end
end
class A
end
A.include Mod1
A.extend Mod1
A.new.method1 #=> 'hi'
A.method1 #=> 'hi'
A.extend Mod1
只不过是
A.singleton_class.include Mod1
要做到这一点,通常会看到如下所示的模块。
module Mod1
def method1
'hi'
end
def self.included(klass)
klass.extend(self)
end
end
在这种情况下,该模块仅需由类include
来>>
class A
end
A.include Mod1
A.new.method1 #=> 'hi'
A.method1 #=> 'hi'
Module::included被称为回调或 hook 方法。 A.include Mod1
使Mod1::included
等于klass
的{{1}}并且等于A
的{{1}}执行。
顺便说一句,还有几种其他的回调方法可以用来达到良好的效果。可以说,最重要的是Module::extended,Module::prepended和Class::inherited。
答案 1 :(得分:1)
我无法想象这是一个好的设计。.但是您可以尝试将include
和extend
两者都放入类中。 include
将方法添加为实例方法,而`e
http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/