получить методы объекта в ruby - PullRequest
12 голосов
/ 17 октября 2011

Меня немного смущает это поведение интерпретатора 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 ]

7 голосов
/ 17 октября 2011

Действительно, метод «методов», похоже, исчез. Вы должны использовать public_instance_methods .

Чтобы объяснить, почему это x.methods(false) ведет себя так, оглянемся на ruby ​​1.9.1 docs http://www.ruby -doc.org / core-1.9.1 / Object.html # method-i-method . Если вы видите исходный код, если передаете параметр, он ведет себя как singleton_methods, что вы и видите.

1 голос
/ 17 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...