2012-04-16 9 views
3

私はActionScriptで、私が追跡したい変数を追加したり削除したりできる簡単なデバッガウィンドウを作っています。私はちょうど私の質問がある変数名をActionScript 3.0で文字列に変換することは可能ですか?

DebuggerMonitor.trackVar(variable). 

ような何かをすることによって、リストに変数を追加することができるようになった、私はへの文字列の中に自分自身(名前、値ではなく)を「変数」回すことができますどのような方法がありますテキストフィールドに追加できますか?

答えて

2

あなたのデバッガがどうあるべきか「インテリジェント」に応じて、。あなただけに沿って名前を渡すことができます。このような文脈で使用された場合、明らかにするので、名前はあなたがプログラムを書いている時点で知られているべき

DebuggerMonitor.trackVar(variable, "variable"); 

ます。また、インスタンス変数名を取得するには、いくつかの反射の魔法を行うことができますが、それは(彼らの名前はコンパイル時に廃棄されます)一時変数のために動作しません。

public function getVariableName(instance:*, match:*):String { 
    var typeDescription:XML = describeType(instance); 
    var variables:XMLList = typeDescription..variable; 
    var accessors:XMLList = typeDescription..accessor; 
    for each(var variable:XML in variables) 
     if(matchesXMLName(instance, variable, match)) 
      return [email protected]; 
    for each(var accessor:XML in accessors) 
     if(matchesXMLName(instance, accessor, match)) 
      return [email protected]; 
    return "No name found."; 
} 

private function matchesXMLName(instance:*, xml:XML, match:*):Boolean { 
    return match == instance[[email protected]()]; 
} 

var varName:String = getVariableName (myObject, variable); 

このような反射を使用することも、非常に高価になります頻繁に使用される場合は、型記述をキャッシュする方法を考える必要があります。

私はあなたがas3commons reflections packageをチェックアウトをお勧めします - 便利な機能の多くはそこにあります...バインディングのいくつかのタイプを作成するために使用されているため、キーワード「VAR」によって生じた混乱は

+0

ありがとうございます。最初の方法は最も論理的なようです。 – bandaro

0

短い答え - ノー:(

これらは実行時に失われているとしてあなたは、個々のインスタンス名タイプ名にアクセスすることはできませんが、

+0

これは正確ではありません。一時変数名のみが本当に失われます。 'describeType'を介してインスタンス変数名を見つけることができます。私の答えを見てください。 – weltraumpirat

0

があります。

  • レキシカルバインディング(キーワード 'var'は関数内で使用されました)。

  • ダイナミックバインディング(キーワード「VAR」がクラスフィールドを宣言するために使用されました)。

レキシカルバインディングは、コンパイル時に、関数が占有するレジスタ空間のレジスタのアドレスとしてコンパイラによって解釈されます。この時点で字句の束縛に与えられた名前は滅び、実行時にそれらを復元することはできないため、変数の "名前"を取得することはできません。

動的バインディングは、宣言するオブジェクトの「パブリックAPI」の一種であり、それらを作成したコードと一緒にコンパイルされていないコードからアクセスすることができます。これらのバインディングの名前はコンパイルされたコードに格納されます。ただし、ActionScriptではLHS値を参照する方法がないため、変数の名前と宣言しているオブジェクトがわかっていても、別の関数に渡すことはできません。しかし、デバッガで、または変数を宣言するオブジェクトのdescribeTypeを呼び出すことでそれを探すことができます。 describeTypeは、プライベート変数に関する情報を、問題のオブジェクトのスコープから呼び出す場合でも、その情報を表示しないことに注意してください。

関連する問題