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

标签 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.."

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

最佳答案

now I want to call met1 from each module. Is it possible to do so?

是的,有可能。使用 Module#instance_method创建第一个 UnboundMethod。然后调用UnboundMethod#bind绑定(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 ..."

关于Ruby - 使用类实例访问来自不同模块的相同命名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20029060/

相关文章:

ruby - ruby 中的这种格式是什么?

python - 什么是像 nanoc 这样的系统的 python 替代品?

interface - 如何导出已导入的接口(interface)?

CentOS 服务器上的 PHP 模块 - 我需要哪些?

haskell - 使用导出的符号

ruby - 如何在 Ruby(不是 Rails)中按日期排序?

ruby-on-rails - Rails 服务器正在运行,但没有将我带到我的项目中

Ruby 数组限制方法

已安装 Python 模块,可以在终端中运行但不能在文件中运行

python - 如何将 Python 包编译为 dll