从特定包含的模块访问方法

时间:2014-08-25 11:37:53

标签: ruby

我有这个设置:

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不是一种选择。

4 个答案:

答案 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)

模块是一种如何将方法添加到对象查找路径的方法。如果包含两个定义具有相同名称和参数列表的方法的模块,则只使用最后定义的方法。