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

ruby – 顶层定义的方法在哪里存在?,第1张

概述我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程: class MyClass def self.my_method end def your_method endend 使用以下代码,我可以在对象空间中搜索每个方法: type = Classname = /^my_method$/result = ObjectSpace.each_object(type).s 我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程:

class MyClass  def self.my_method  end  def your_method  endend

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

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

它发现它显示以下输出:

[MyClass]

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

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

mc = MyClass.newdef mc.our_methodend

只需更改搜索者:

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

它还发现:

[#<MyClass:0x8f86760>]

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

def hIDdenend

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

解决方法

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

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

self        #=> mainself.class  #=> Object

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

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

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

def foo; :bar; endmethod(:foo).owner     #=> ObjectObject.new.foo         #=> NoMethodError: private method `foo' calledObject.new.send(:foo)  #=> :bar

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

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

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

总结

以上是内存溢出为你收集整理的ruby – 顶层定义的方法在哪里存在?全部内容,希望文章能够帮你解决ruby – 顶层定义的方法在哪里存在?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1286760.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存