Rubyでかなり頑丈なリフレクションをしたいと思います。呼び出しスタックの上位にあるさまざまな呼び出し関数の引数の名前を返す関数を作成したいとします(ただ1つで十分でしょうが、なぜそこで停止するのですか?)。私はKernel.caller
を使うことができます、ファイルに行って、引数リストを解析しますが、それは醜く、信頼できないでしょう。リフレクションを使用して引数名を取得する方法
:
module A
def method1(tuti, fruity)
foo
end
def method2(bim, bam, boom)
foo
end
def foo
print caller_args[1].join(",") #the "1" mean one step up the call stack
end
end
A.method1
#prints "tuti,fruity"
A.method2
#prints "bim, bam, boom"
私はParseTreeか、このタスクのためのいくつかの同様のツールを使用しますが解析ツリーを見て気にしないだろう、それを使用する方法は明らかではありませんこの目的のために。 thisのようなCエクステンションを作成することも別の可能性があります。
私はおそらくC拡張のいくつかの種類が必要になることがわかります。私は私の質問は、Cの拡張機能の組み合わせが最も簡単に動作するだろうということを意味すると思います。私は、呼び出し元+ ParseTreeだけで十分ではないと思います。
「自動デバッグ」というよりも、私はこれをやりたいのですが、関数の呼び出し条件と戻り条件の自動チェックにこの機能を使用するといいでしょう。
x
と
y
が正でなかった場合
check_positive
が例外をスローします
def add x, y
check_positive
return x + y
end
。明らかに、それ以上のことはあるだろうが、これが十分な動機を与えることを願っている。
を使用すると、実行順序と引数を決定したいように見えますがあります。ロギングを使用できない理由はありますか?クラス内のすべてのメソッドを開くためにメタプログラミングを行うこともできますし、自動的に引数を記録して、あなたが望むことをすることができます。 – runako