追跡したい変数を追加および削除できる、ActionScript で自分用の簡単なデバッガー ウィンドウを作成しています。次のようなことをするだけで、リストに変数を追加できるようになりました
DebuggerMonitor.trackVar(variable).
私の質問は、「変数」自体 (値ではなく名前) を文字列に変換してテキスト フィールドに追加する方法はありますか?
デバッガーがどの程度「インテリジェント」であるかに応じて、名前を渡すことができます。
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 variable.@name;
for each(var accessor:XML in accessors)
if(matchesXMLName( instance, accessor, match ))
return accessor.@name;
return "No name found.";
}
private function matchesXMLName( instance:*, xml:XML, match:* ):Boolean {
return match == instance[xml.@name.toString()];
}
var varName:String = getVariableName ( myObject, variable );
このようなリフレクションを頻繁に使用すると、かなりコストがかかります。型の説明をキャッシュする方法を考える必要があります。
as3commons リフレクション パッケージをチェックすることをお勧めします- そこには便利な機能がたくさんあります...
キーワード「var」はいくつかのタイプのバインディングを作成するために使用されるため、混乱が生じます。
字句バインディング(キーワード「var」は関数内で使用されました)。
動的バインディング(キーワード「var」はクラス「フィールド」を宣言するために使用されました)。
字句バインディングは、コンパイル時にコンパイラーによって、関数が占有するレジスター・スペースのレジスターのアドレスとして解釈されます。字句バインディングに付けられた名前はこの時点で消滅し、実行時に復元することはできません。したがって、変数の「名前」を取得することはできません。
動的バインディングは、それらを宣言するオブジェクトの一種の「パブリックAPI」であり、それらを作成したコードと一緒にコンパイルされなかったコードからアクセスされる可能性があります。これが、これらのバインディングの名前を反映する目的である理由です。コンパイルされたコードに保存されます。ただし、ActionScriptにはLHS値を参照する方法がないため、変数の名前とそれを宣言しているオブジェクトがわかっていても、それを別の関数に渡すことはできません。describeType
ただし、デバッガーで検索するか、変数を宣言しているオブジェクトを呼び出すことで検索できます。describeType
問題のオブジェクトのスコープから呼び出している場合でも、プライベート変数に関する情報は表示されないことに注意してください。
短い答え - いいえ:(
タイプ名にはアクセスできますが、個々のインスタンス名にはアクセスできません。これらは実行時に失われるためです。