3

我正在为自己在 ActionScript 中创建一个简单的调试器窗口,我可以在其中添加和删除我想要跟踪的变量。我能够通过执行类似的操作将变量添加到列表中

DebuggerMonitor.trackVar(variable).

我的问题是,有什么方法可以将“变量”本身(名称,而不是值)转换为要添加到文本字段中的字符串?

4

3 回答 3

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 反射包——里面有很多有用的功能......

于 2012-04-16T05:28:20.830 回答
0

简短的回答 - 不:(

您可以访问类型名称,但不能访问单个实例名称,因为这些名称在运行时会丢失。

于 2012-04-16T04:33:06.997 回答
0

关键字“var”会引起混淆,因为它用于创建多种类型的绑定。

  • 词法绑定(在函数内部使用了关键字“var”)。

  • 动态绑定(关键字“var”用于声明类字段)。

编译器在编译时将词法绑定解释为函数占用的寄存器空间的寄存器地址。赋予词法绑定的名称此时会消失,并且无法在运行时恢复它们 - 因此您无法获得变量的“名称”。

动态绑定是声明它们的对象的一种“公共 API”,它们可以从未与创建它们的代码一起编译的代码中访问,这就是为什么为了反映这些绑定的名称的目的存储在编译后的代码中。但是,ActionScript 无法引用 LHS 值,因此即使您知道变量的名称和声明它的对象,也无法将其传递给另一个函数。describeType但是您可以在调试器中或通过调用声明变量的对象来查找它。请注意,describeType即使您从相关对象的范围内调用它,它也不会显示有关私有变量的信息。

于 2012-04-16T08:18:37.740 回答