Ruby - 使用类实例从不同的模块访问相同的命名方法

时间:2013-11-17 09:15:37

标签: ruby module

我有2个模块M1和M2,每个模块包含与met1相同的方法名称

我有一个包含这些模块的MyClass类。 我创建了MyClass的实例测试,现在我想从每个模块调用met1。 是否可以这样做?

这是代码:

module M1
def met1
    p "from M1 met1.."
end
end
module M2
def met1
    p "from M2 met1 ..."
end
end

class MyClass

include M1, M2
def met2
    p "met2 from my class"
end
end

test = MyClass.new
test.met1 # From module 1
test.met2 # from my class
test.met1 # from module 2 (how to ?)

请让我知道如何做到这一点。

我的输出是

"from M1 met1.."
"met2 from my class"
"from M1 met1.."

这可能是一个非常简单的查询,但请回答。 感谢

1 个答案:

答案 0 :(得分:4)

  

现在我想从每个模块调用met1。是否可以这样做?

是可能的。使用Module#instance_method创建第一个UnboundMethod。然后调用UnboundMethod#bind来绑定test对象。现在你有了Method对象。现在请致电Method#call以获得预期的输出。

module M1
  def met1
    p "from M1 met1.."
  end
end
module M2
  def met1
    p "from M2 met1 ..."
  end
end

class MyClass

  include M1, M2
  def met2
    p "met2 from my class"
  end
end

test = MyClass.new

test.class.included_modules.each do |m|
  m.instance_method(:met1).bind(test).call unless m == Kernel
end
# >> "from M1 met1.."
# >> "from M2 met1 ..."