2016-05-27 16 views
0

Gibt es eine Möglichkeit, die Zeichenfolgendarstellung des vollständig qualifizierten Pfades zu der Methode zu erhalten?Erhalten Sie den vollständig qualifizierten Namen der Methode

folgende IRB-Sitzung vor:

> foo = File.stat("/") 
> magic(foo.ctime) or foo.ctime.magic 
=> "File::Stat#ctime" 

Gibt es eine eingebaute Funktion, die die "Magie" tut? Wenn nicht, kann ich die Zeichenfolge dynamisch durch eine Reflektion abrufen?

Hinweis: Ich bin mir dieser question bewusst, aber ich kann den Hebel nicht verwenden.

Antwort

3

Man könnte Object#method nennen, eine Instanz von Method Rückkehr:

foo.method(:ctime) 
#⇒ File::Stat#ctime() 

Der vollständig qualifizierte Methodennamen könnten beispielsweise extrahiert werden, von einem Method#to_s:

foo.method(:ctime).to_s[/(?<=\A#<Method:).*(?=>)\z/] 
#⇒ "File::Stat#ctime" 

bin ich von jeder Fähigkeit nicht bewusst, ohne diesen regexp Trick, um die FQ-Namen direkt von Method Beispiel zu erhalten.

Wie richtig von Алексей Кузнецов in Kommentaren darauf, regexp man vermeiden könnte verwenden:

full_method_name = "#{method.owner.name}##{method.name}" 
#⇒ "File::Stat#ctime" 
+0

genial, danke –

+2

@mudasobwa Methode vollständige Namen zu bauen, ohne regexp mit uns 'method = foo.method verwenden könnten (: ctime) # => Datei :: Stat # ctime() full_method_name = "# {methodenbesitzer.name} ## {method.name}" # => "Datei :: Stat # ctime" ' –

+0

Ich dachte, dass es einen besseren Weg als die Regexp geben sollte, und begann auch diesen Pfad - aber es sieht so aus, als ob #name tatsächlich auf eingebauten Core-Methoden fehlschlägt, die in diesem Fall in C implementiert sind? Vielleicht ist es ein Fehler? 'File.method (: ctime) .eigner.name # => nil'. Was? – jrochkind

Verwandte Themen