假设我有一个模块:
module M
def self.foo
...
end
def bar
...
end
end
模块M
包含在一个类中。
class A
include M
end
我想从 调用foo
,bar
最终将在 的实例上调用A
。在里面做这个的最好方法是什么bar
?
当然我只能说M.foo
,但那是模块名称的重复,感觉没有必要。
通常,在 amodule
中,将类方法和实例方法分开是一个好习惯,如下所示:
module M
def bar
puts "BAR"
self.class.foo
end
module ClassMethods
def foo
puts "FOO"
end
end
end
现在,在一个类中,理想情况下,我希望include
这个模块M
以我A.foo
作为类方法和A.new.bar
实例方法的方式获得。诀窍是Module.included
。
module M
def bar
puts "BAR"
self.class.foo
end
module ClassMethods
def foo
puts "FOO"
end
end
# when module is included, extend the class with ClassMethods
def self.included(base)
base.extend ClassMethods
end
end
class A
include M
end
A.singleton_methods #=> [:foo]
A.new.foo
#=> BAR
#=> FOO
使用这种方法,您可以引用类方法,self.class
它会自动工作。
希望能帮助到你。
不是很优雅,但是
def bar
Module.nesting.last.foo
end
应该这样做。
请注意,它Module#nesting
返回一个数组,因为一个模块可能嵌套在另一个模块中。在一般情况下,您需要应用正确的数组索引来选择您想要的模块。
我认为使用M.foo
是最好的,但作为一种练习,可以M#bar
进行如下更改。
module M
def self.foo
puts "In self.foo"
end
def bar
puts "In bar"
method(__method__).owner.foo
end
end
class A
include M
end
a = A.new
a.bar
# In bar
# In self.foo