2011-01-12 13 views
17

Zastanawiam się, czy istnieje wywołanie metody Ruby, która pokazuje tylko metody zdefiniowane przez obiekt Ruby, z którego jest wywoływana, w przeciwieństwie do wszystkich metod zdefiniowanych przez jego klasy przodków, co wydaje się robić methods.Jak mogę sprawdzić metody obiektu Ruby?

Odpowiedz

30

methods przyjmuje opcjonalny parametr boolowski, który określa, czy należy również wymienić metody z klasy obiektu i jego nadklas lub tylko z pojedynczych metod obiektu. Tak więc możesz zrobić obj.methods(false), aby uzyskać tylko pojedyncze metody zdefiniowane na obj.

Jeśli chcesz metody zdefiniowane przez klasę obiektu, ale nie te zdefiniowane przez jej nadklasy, możesz to uzyskać, wywołując instance_methods(false) na klasie obiektu, więc jest to obj.class.instance_methods(false).

1

Masz kilka opcji - object.methods, object.public_methods, object.singleton_methods ... to zależy od tego, co chcesz. Ponieważ oboje zwracają tablicę, może chcesz spróbować czegoś takiego:

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

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

Masz na myśli 'parent = obj.class.superclass', prawda? – sepp2k

+1

'whatever.methods' zwraca' Tablicę' w wersji Ruby, której używam. To samo z 'whatever.public_methods'. – cHao

+0

@ sepp2k - tak, dziękuję - naprawione! – sethvargo

4

Jestem częściowe do obj.methods.sort ale niektóre inne odpowiedzi są lepsze w pewnych przypadkach, gdy opisują

Można również użyć obj.methods.sort.grep /foo/, aby znaleźć nazwy metod pasujące do wyrażenia regularnego. Jest to pomocne, gdy masz pojęcie o tym, czego szukasz.