2017-07-26 7 views
0

と、発信者の完全な名前空間を取得し、私はそれぞれに印刷に興味が機能: - フルメソッドの名前空間 - メソッドのパラメータとその引数(値)ルビーRubyアプリケーションのデバッグにそのパラメータの名前と引数

用例えば、そのようなFoo::Bar.baz 'val1', 'val2'として引数とbazを呼び出すときに、メッセージは次の出力Foo::Bar.baz(p=val1, q=val2)(または任意の同様の出力)で印刷されるべき次のコードブロック

module Foo 
    module Bar 
    def self.baz(p, q) 
    end 
    end 
end 

を与え

私はRubyリフレクションに精通しているので、各関数にそれを印刷するためのいくつかの追加コードを導入することができます。しかし、単一の修正ポイントは至福です。したがって、各メソッドは、そのような出力を生成する別のメソッドを呼び出すことは素晴らしいでしょう。

私の質問は以下のとおりです。

  1. は、上記のような出力が得られますお互いinvokeメソッド方法を、紹介するとにかくはありますか?

  2. 他の方法の冒頭に印刷方法(関数)をバインドして同じ結果を得るにはとにかくありますか?

答えて

1

あなたが探していると、結合イントロスペクションと組み合わせる#set_trace_func次のとおりです。

module Foo 
    module Bar 
    def self.baz(p, q) 
    end 
    end 
end 

intercept_event = proc do |event, _, _, method_name, method_binding, _| 
    if event == 'call' 
    self_in_method = method_binding.eval('self') 

    parameter_names = self_in_method.method(method_name).parameters.map(&:last) 
    parameter_list = parameter_names.map do |name| 
     "#{name}=#{method_binding.local_variable_get(name)}" 
    end 

    puts "#{self_in_method}.#{method_name}(#{parameter_list.join ', '})" 
    end 
end 

set_trace_func intercept_event 

Foo::Bar.baz 'val1', 'val2' # Foo::Bar.baz(p=val1, q=val2) 

これはCメソッドのために動作しないこと。それらを処理するには'call'の代わりに'c-call'を確認することができます。ただし、メソッドのパラメータを文字列evalに移動する必要があります。これらのメソッドのselfはRubyメソッドと同じではありません。

+0

あなたは魔術師です。ありがとうございました:) – MrRoth

+0

@MrRoth、happy to help(: – ndn

関連する問題