我有这个设置:
module FirstModule
def foo(arg)
23 + arg + @private_variable
end
end
module SecondModule
def foo(arg)
24 + arg + @private_variable
end
end
class Foo
include FirstModule
include SecondModule
def initialize
@private_variable = 0
end
def access_place
# call FirstModule#foo(1)
puts foo(1)
end
end
Foo.new.access_place
我正在尝试访问FirstModule#foo
。我想知道是否有任何方法可以这样做,或者你是否有任何其他的消息。重要的是,此模块中的两个方法具有相同的名称并且可以访问某些私有数据,因此使用module_function
不是一种选择。
答案 0 :(得分:3)
您可以使用alias_method
来保留重写的方法:
class Foo
include FirstModule
alias_method :first_foo, :foo
include SecondModule
def access_place
first_foo(1) # FirstModule#foo
foo(1) # SecondModule#foo
end
end
答案 1 :(得分:1)
您可以获取特定模块的方法,将其绑定到self
然后调用它。
method = FirstModule.instance_method(:foo)
method.bind(self).call
答案 2 :(得分:0)
找到另一种解决方案,不会污染我的班级。使用Module#instance_method
:
FirstModule.instance_method(:foo).bind(self).call(1)
答案 3 :(得分:0)
模块是一种如何将方法添加到对象查找路径的方法。如果包含两个定义具有相同名称和参数列表的方法的模块,则只使用最后定义的方法。