ruby – 顶层定义的方法在哪里存在?
我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程:
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 此外,在定义这样的方法时,哪个是当前类? 解决方法
我们可以通过在这个顶级范围内检查self来轻松找出我们所处的对象: self #=> main self.class #=> Object 所以我们不是一个Class,而是一个被称为“main”的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都不包含私有方法,而是需要 Object.instance_methods.include?(:foo) #=> false Object.private_instance_methods.include?(:foo) #=> true *请注意,Pry(至少v0.10.1)改变了这一点,使其在REPL public中的顶级定义方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |