获取ruby中对象的方法

时间:2011-10-17 00:03:18

标签: ruby reflection

我对ruby(1.9)解释器中的这种行为感到有点困惑

 class Foo
   def pub
     private_thing
   end

   private
   def private_thing
     puts "private touch"
   end
 end



x = Foo.new
x.pub
private touch
=> nil

到目前为止一切顺利。

x.private_thing
NoMethodError: private method `private_thing' called for #<Foo:0xb76abd34>
from (irb):25
from :0

还好。这就是我的预期

但为什么这是空的?

x.methods(false)
=> []

虽然这给了我期待的东西?

Foo.instance_methods(false)
=> ["pub"]

2 个答案:

答案 0 :(得分:7)

实际上,“方法”方法似乎已经消失了。您应该使用public_instance_methods代替。

要解释为什么x.methods(false)的行为方式,请回顾一下ruby 1.9.1 docs http://www.ruby-doc.org/core-1.9.1/Object.html#method-i-methods。如果你看到源代码,如果你传入一个参数,它的行为就像是singleton_methods,这就是你所看到的。

答案 1 :(得分:1)

似乎除了ruby 1.9.1之外没有Object#方法的文档。好像它不再存在。 (看看http://www.ruby-doc.org/core-1.9.3/Object.html

我想这是为了澄清一个人应该使用.singleton_methods或.instance_methods中的一个来确定方法的存在位置。

在任何情况下,未记录的方法都可以做任何事情。