2009-01-22 6 views

Antwort

10

Jede Klassen-/Objektmethode ist ein Objekt in Ruby und besitzt einige eigene Methoden.

So können Sie dies tun:

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

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

Schnell bisschen RegEx und du bist fertig.

+0

Sweet angehängt ist, das ist großartig – dylanfm

1

Ich denke, so etwas wie dies funktionieren könnte

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" 

ich das letzte nehme an, die haben Methode ist derjenige, der es definiert?

0

Ich bin mir nicht sicher, ob wir genau herausfinden können, woher eine Methode kommt. Wenn Sie ein Mixin hinzufügen, werden alle Methoden Teil Ihrer Klasse, als ob Sie sie dort abgelegt hätten. Siehe Antwort von dylanfm für ca.

+1

method.inspect wird sagen Sie, wenn eine Methode an einen Mixin –

7

tobyhede's Antwort ist genial, aber ich habe gerade ein bisschen graben in irb und es gibt keine Notwendigkeit, die Ausgabe von #inspect zu zerstückeln. Die Method Klasse

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

hat einige nützliche Methoden für sich:

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

Insbesondere die #owner Methode, die den Eigentümer als eine richtige Objekt zurückgibt:

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

genial finden, wird dies definitiv nützlich sein. –

+0

natürlich! Das ist sehr cool. –

Verwandte Themen