2011-01-12 5 views
17

Мне интересно, есть ли вызов метода Ruby, который показывает только методы, определенные объектом Ruby, из которого он вызван, в отличие от всех методов, определенных его классами предков, что и делает methods.Как проверить методы объекта Ruby?

ответ

30

methods принимает необязательный логический параметр, который указывает, следует ли также перечислить методы из класса объекта и его суперклассов или только одноточечные методы объекта. Таким образом, вы можете сделать obj.methods(false), чтобы получить только однотонные методы, определенные на obj.

Если вы хотите, чтобы методы, определенные классом объекта, но не те, которые определены его суперклассами, вы можете получить это, вызвав instance_methods(false) в классе объекта, так что это obj.class.instance_methods(false).

1

У вас есть несколько вариантов - object.methods, object.public_methods, object.singleton_methods ... это зависит от того, что вы хотите. Так как они оба возвращают массив, вы можете попробовать что-то вроде:

# obj is the current object 
parent = obj.class.superclass 

methods = (obj.methods - parent.methods) 
+1

Вы имеете в виду 'parent = obj.class.superclass', правильно? – sepp2k

+1

'what.methods' возвращает' Array' в версию Ruby, которую я запускаю. То же самое с 'whatever.public_methods'. – cHao

+0

@ sepp2k - да, спасибо - исправлено! – sethvargo

4

Я неравнодушен к obj.methods.sort, но некоторые из других ответов лучше в некоторых случаях, как они описывают

Вы также можете использовать obj.methods.sort.grep /foo/, чтобы найти имена методов, соответствующие регулярному выражению. Это полезно, когда у вас есть представление о том, что вы ищете.

Смежные вопросы