Подтвердить что ты не робот

Получить методы объекта в рубине

Я немного запутался в этом поведении от интерпретатора 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"]
4b9b3361

Ответ 1

Действительно, метод "методов", кажется, исчез. Вместо этого следует использовать 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, это то, что вы используете.

Ответ 2

Кажется, нет документации для методов Object # за рубином 1.9.1. Как будто его больше нет. (посмотрите http://www.ruby-doc.org/core-1.9.3/Object.html)

Я предполагаю, что это должно разъяснить, что нужно использовать один из .singleton_methods или .instance_methods, чтобы определить, где живут методы.

В любом случае недокументированный метод может делать все, что ему нравится.