加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何以编程方式确定哪个类/模块定义了被调用的方法?

发布时间:2020-12-17 02:51:33 所属栏目:百科 来源:网络整理
导读:在 Ruby中,我如何以编程方式确定哪个类/模块定义了被调用的方法? 在给定的范围内说我调用some_method().在相同的范围内,我想调用一个函数find_method(:some_method),它将返回哪个Class,Singleton类或Module定义some_method. 这里有一些代码来说明我的意思
在 Ruby中,我如何以编程方式确定哪个类/模块定义了被调用的方法?

在给定的范围内说我调用some_method().在相同的范围内,我想调用一个函数find_method(:some_method),它将返回哪个Class,Singleton类或Module定义some_method.

这里有一些代码来说明我的意思:

class Foo
  include ...

  def bar
    ...
    some_method() # calls a method in scope,assume it exists

    find_method(:some_method) # Returns where the method is defined
                              # e.g. => SomeClassOrModule
    ...
  end
end

我猜我必须使用复杂的反射函数混合,从self开始并使用self.ancestors走向继承树,使用method_defined?检查是否在类或模块上定义了方法,并且可能还有一些其他技巧来检查从最里面到最外层的范围(因为代码可以在例如instance_eval内运行).

我只是不知道正确的顺序和Ruby元模型的所有细微之处来实现find_method,这样它在搜索中都是详尽无遗的,并且从方法调度解析的角度来看是正确的.

谢谢!

解决方法

发现这非常简单.整齐!

在this answer上展开,以显示如何实际返回所有者类:

foo.method(:some_method).owner

如果你觉得有必要,可以在实例方法中包装它,但那不是那么糟糕,是吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读