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

ruby – 顶层定义的方法在哪里存在?

发布时间:2020-12-17 02:54:46 所属栏目:百科 来源:网络整理
导读:我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程: class MyClass def self.my_method end def your_method endend 使用以下代码,我可以在对象空间中搜索每个方法: type = Classname = /^my_method$/result = ObjectSpace.each_object(type)
我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程:

class MyClass
  def self.my_method
  end
  def your_method
  end
end

使用以下代码,我可以在对象空间中搜索每个方法:

type = Class
name = /^my_method$/
result = ObjectSpace.each_object(type).select do |o|
  o.instance_methods(false).grep(name).size > 0 || o.methods.grep(name).size > 0
end
p result

它发现它显示以下输出:

[MyClass]

由于搜索器代码还搜索实例方法,因此在查找your_method时会显示相同的输出.

即使我向对象添加单例方法:

mc = MyClass.new
def mc.our_method
end

只需更改搜索者:

type = Object
name = /^our_method$/
result = ObjectSpace.each_object(type).select do |o|
  o.methods.grep(name).size > 0
end
p result

它还发现:

[#<MyClass:0x8f86760>]

问题是,如何找到顶级对象中定义的方法?这个方法:

def hidden
end

此外,在定义这样的方法时,哪个是当前类?

解决方法

Which is the current class when defining a method like this?

我们可以通过在这个顶级范围内检查self来轻松找出我们所处的对象:

self        #=> main
self.class  #=> Object

所以我们不是一个Class,而是一个被称为“main”的Object实例.

How do I find a method defined in the top level object?

这是它变得有趣的地方. Ruby中的顶级范围对象具有特殊的行为,但是发现此处定义的方法所处的位置相对容易:

def foo; :bar; end
method(:foo).owner     #=> Object
Object.new.foo         #=> NoMethodError: private method `foo' called
Object.new.send(:foo)  #=> :bar

因此,在顶层定义的方法是Object的(private *)实例方法.你的“搜索者”无法找到它的原因是因为这些方法是私有的,方法和instance_method都不包含私有方法,而是需要private_methodsprivate_instance_methods

Object.instance_methods.include?(:foo)          #=> false
Object.private_instance_methods.include?(:foo)  #=> true

*请注意,Pry(至少v0.10.1)改变了这一点,使其在REPL public中的顶级定义方法.

(编辑:李大同)

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

    推荐文章
      热点阅读