あなたは一例として.NETを使用しているので、のはそれに簡単に掘り下げてみましょう。 C#では、あなたはExpression
を取る関数作成することができます。
void BadArgument<T>(Expression<Func<T>> argExpr)
{
}
をしかし、この関数の呼び出しから変数名を抽出することができるようにするために、あなたはコールを常に使用することを確認する必要があります正確に正しい構文(コンパイル時にこれを強制する方法がないにもかかわらず):
if(x < 0)
BadArgument(() => x);
だから行うことができますが、それは非常に壊れやすいとかなり遅いです。基本的にはラムダ式() => x
に基づいて式ツリー全体を作成するための命令を生成しています。呼び出す関数はその式ツリーを解析して引数の名前を見つけようとします。
このようなことはjavascriptで行うことができますか?確かに! JavaScriptで
上記のラムダ式の当量であろうように、クロージャは、内部関数を介して生成される:
function(){return x;}
とJavaScriptはスクリプト言語であるため、各機能は、独自の定義に相当し文字列として。言い換えれば、上記の機能に.toString()
を呼び出すことが得られます:
function(){return x;}
This jsfiddle showsロギング形式の関数でこれを活用する方法。結果として得られるファンクション文字列を自由に解析することができます。これは、.NET Expression Treeの解析よりもわずかに問題になります。さらに、実際のの値をとしてx
にすることは、.NETよりもさらに簡単です:あなたはただcall the functionです!
しかし、あなたはそれはあなたのべきを意味するものではありません行うことができという理由だけで。それはジー・達人パーラートリックとして素敵だが、それは右下それに来るとき、それはそれだけの価値はありません。
- それは壊れやすいです:どのようないくつかの開発者は右のそれを使用して、あなたにその機能を提供していない場合あなたは解析できませんか?
- それは縮小では動作しません:あなた縮小さ関数は、あなたの変数名を変更したため、変数
a
が不正な値を持っていたメッセージを取得想像してみてください。
- これはオーバーヘッドを追加します。
function(){return x;}
を"x"
より小さくすることはできません。
- 最後に、複雑です。 '言っ途切れる。
Worthは指摘しています。.NETでのリフレクションによって変数名を取得することはできません。 – StriplingWarrior
@StriplingWarrior。あなたは 'Expression'を使うことができます。私は.Net開発者のために単純化しています... – gdoron
文字列に変数名を記録するのはなぜですか?あなたの例では、 'console.log( '変数xは無効な値:'、x)' – SpYk3HH