2016-05-27 8 views
0

メソッドへの完全修飾パスの文字列表現を取得する方法はありますか?メソッドの完全修飾名を取得

は、IRBのセッションを次の点を考慮

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

は「魔法」を行い任意の組み込み関数はありますか?もしそうでなければ、リフレクションを行うことで文字列を動的に取得できますか?

注:私はこのquestionを認識していますが、私は使用できません。 Methodのインスタンスを返す

答えて

3

Object#methodを呼ぶかもしれないが、:

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

完全に修飾されたメソッド名は、例えば、抽出されるかもしれませんMethod#to_sから:

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

私は、この正規表現のトリックなしで、Methodインスタンスから直接FQ-名を取得する任意の能力を認識していないです。

は、同様に適切に1が使用する正規表現を避けるために、コメントでАлексейКузнецовによって指さ:

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

素晴らしい、我々は 'メソッド= foo.methodを使用することができます正規表現を使用しない方法フルネームを構築するためにあなたに –

+2

@mudasobwaに感謝します(:ctime) #=> File :: Stat#ctime() full_method_name = "#{method.owner.name} ## {メソッド名}" #=> "File :: Stat#ctime" ' –

+0

私はregexpよりも良い方法がなければならないと思って、この道もやってみましたが、#nameは実際にはCで実装された組み込みコアメソッドでは失敗します。多分それはバグでしょうか? 'File.method(:ctime).owner.name#=> nil'です。何? – jrochkind

関連する問題