2012-04-16 18 views

回答

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 - 有很多在裏面有用的功能...

+0

謝謝。第一種方法似乎是最合乎邏輯的。 – bandaro 2012-04-16 12:37:03

0

簡短的回答 - 不:(

您可以訪問類型的名字,但沒有單獨的實例名稱,因爲這些都是在運行時丟失

+0

這不完全正確。只有臨時變量名稱會丟失。你可以通過'describeType'找到一個實例變量名。看到我的答案。 – weltraumpirat 2012-04-16 05:31:55

0

有造成關鍵字「變種」,因爲它是用來創建幾種類型綁定的混亂。

  • 詞法綁定(關鍵字'var'用於函數內部)。

  • 動態綁定(關鍵字'var'用於聲明一個類的字段)。

詞彙綁定在編譯時被編譯器解釋爲函數佔用的寄存器空間的寄存器地址。賦予詞法綁定的名稱此時會消失,並且無法在運行時恢復它們 - 因此無法獲取變量的「名稱」。

動態綁定是一種聲明它們的對象的「公共API」,它們可以從沒有與創建它們的代碼一起編譯的代碼中訪問,這就是爲什麼爲了反思這些綁定的名稱存儲在編譯代碼中。但是,ActionScript無法引用LHS值,因此即使知道變量的名稱和聲明它的對象,也不能將其傳遞給另一個函數。但是您可以在調試器中查看它,或者在聲明該變量的對象上調用describeType。請注意,describeType將不會顯示有關私有變量的信息,即使您是從相關對象的範圍調用它。

相關問題