我在ActionScript中为自己创建了一个简单的调试器窗口,我可以在其中添加和删除我想要跟踪的变量。我只需要执行类似
之类的操作就可以将变量添加到列表中DebuggerMonitor.trackVar(variable).
我的问题是,有什么方法可以将“变量”本身(名称,而不是值)转换为要添加到文本字段中的字符串?
答案 0 :(得分: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 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 reflections package - 其中有很多有用的功能...
答案 1 :(得分:0)
简短回答 - 否:(
您可以访问类型名称,但不能访问单个实例名称,因为这些名称在运行时会丢失。
答案 2 :(得分:0)
关键字'var'引起混淆,因为它用于创建多种类型的绑定。
词法绑定(关键字'var'在函数内部使用)。
动态绑定(关键字'var'用于声明类'字段)。
编译器在编译时将词法绑定解释为函数占用的寄存器空间寄存器的地址。赋予词法绑定的名称此时会消失,并且无法在运行时恢复它们 - 因此您无法获取变量的“名称”。
动态绑定是声明它们的对象的一种“公共API”,它们可以从未与创建它们的代码一起编译的代码中访问,这就是为什么,为了反映名称的目的这些绑定存储在编译代码中。但是,ActionScript无法引用LHS值,因此即使您知道变量的名称和声明它的对象,也不能将其传递给另一个函数。但是您可以在调试器中查找它,或者在声明变量的对象上调用describeType
。请注意,即使您从相关对象的范围调用私有变量,describeType
也不会显示私有变量的信息。