我有两个模块具有相同的方法名称。当我在某个类中包含两个模块时,只执行最后一个模块的方法。我需要在初始化类时执行它们:
class MyClass
include FirstModule
include SecondModule
def initialize
foo # foo is contained in both modules but only the one in SecondModules is executed
end
end
可行吗?
答案 0 :(得分:10)
正如Yusuke Endoh所说,Ruby中的一切都是可行的。在这种情况下,你必须忘记只是说“foo”的便利性,你必须非常清楚你真正想要做的事情,比如:
class MyClass
include FirstModule
include SecondModule
def initialize
FirstModule.instance_method( :foo ).bind( self ).call
SecondModule.instance_method( :foo ).bind( self ).call
end
end
'FirstModule.instance_method ......'这一行可以简单地用'foo'代替,但是通过明确表示,你确保无论如何,你都在调用mixin中的方法,你认为你做的是
答案 1 :(得分:7)
您可以修改附带的模块吗?也许您只需在第二个模块中调用super
?
module M1
def foo
p :M1
end
end
module M2
def foo
p :M2
defined?(super) && super
end
end
class SC
include M1
include M2
def initialize
foo
end
end
SC.new
或许你真的想要这样做?
module M1
def bar; p :M1 end
end
module M2
include M1
def foo; bar; p :M2 end
end
class SC
include M2
def initialize; foo end
end