2009-01-22 7 views

Odpowiedz

10

Każda metoda klasy/obiektu jest obiektem w języku Ruby i ma kilka własnych metod.

Więc można to zrobić:

[].method(:count).inspect 
=> "#<Method: Array#count>" 

[].method(:detect).inspect 
=> "#<Method: Array(Enumerable)#detect>" 

Krótki kawałek RegEx i gotowe.

+0

Słodkie, to wspaniałe – dylanfm

1

myślę coś takiego może pracować

def print_ancestor_definitions(cl,method) 
    ancestors = cl.ancestors 
    p ancestors.join(' < ') #Print heirarchy 
    p "Searching..." 
    ancestors.each do |c| 
    if c.instance_methods.include? method 
     p "#{c} defines #{method} as an instance method!" 
    elsif c.singleton_methods.include? method 
     p "#{c} defines #{method} as a singleton method" 
    else 
     p "#{c} doesn't define #{method}" 
    end 
    end 
end 

print_ancestor_definitions(Array,'find') 
# >> "Array < Enumerable < Object < Kernel" 
# >> "Searching..." 
# >> "Array defines find as an instance method!" 
# >> "Enumerable defines find as an instance method!" 
# >> "Object doesn't define find" 
# >> "Kernel doesn't define find" 

Przypuszczam ostatnia mieć metoda jest tą, która ją definiuje?

0

Nie jestem pewien, czy możemy dokładnie określić, skąd bierze się metoda, kiedy dodajesz mixin, wszystkie metody stają się częścią twojej klasy, tak jakbyś je tam umieścił. Zobacz odpowiedź od dylanfm na ok.

+1

method.inspect będzie powiedzieć, czy metoda jest dołączona do Mixin –

7

Odpowiedź Tobyhede jest niesamowita, ale po prostu wykonałem trochę kopania w irb i nie ma potrzeby zmniejszania wydajności o #inspect. Method klasa

>> Object.new.method(:inspect) 
=> #<Method: Object(Kernel)#inspect> 

ma kilka przydatnych metod własnych:

>> Object.new.method(:inspect).methods - Object.methods 
=> ["owner", "call", "to_proc", "unbind", "arity", "receiver", "[]"] 

w szczególności metody #owner, która zwraca właścicielowi jako właściwego obiektu:

>> [].method(:count).owner 
=> Array 
>> [].method(:detect).owner 
=> Enumerable 
+0

niesamowite znalezisko, to na pewno się przyda. –

+0

oczywiście! To bardzo fajnie. –