
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_methods和private_instance_methods:
Object.instance_methods.include?(:foo) #=> falseObject.private_instance_methods.include?(:foo) #=> true
*请注意,Pry(至少v0.10.1)改变了这一点,使其在REPL public中的顶级定义方法.
总结以上是内存溢出为你收集整理的ruby – 顶层定义的方法在哪里存在?全部内容,希望文章能够帮你解决ruby – 顶层定义的方法在哪里存在?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)