2017-10-16 184 views
0

我不知道如何提出這個問題。如何在不創建新變量的情況下引用現有變量?

我有一個變量

​​

我有一個函數

public static function setItemInSlot(Item:String, Slot:Number, MaxDurability:Number = 0) 
    { 
     UI_Taskbar_Inventory.InventoryItems[Slot] = Item; 

     if(MaxDurability == 0) 
     { 
      trace("Before change " + UI_Taskbar_Inventory.InventoryDurability); 
      UI_Taskbar_Inventory.InventoryDurability[Slot] = "MaxDurability" + Item; 
      trace("After change " + UI_Taskbar_Inventory.InventoryDurability); 
     } 
     else 
     { 
      trace("not using default durability"); 
     } 
    } 

這個功能,是造成我頭疼的唯一部分是此行

UI_Taskbar_Inventory.InventoryDurability[Slot] = "MaxDurability" + Item 

它輸出

改變之前0,0,0,0,0,0,0,0

變化0,MaxDurabilityTestItem後,0,0,0,0,0,0

雖然我想它輸出

改變之前0,0,0,0,0,0,0,0

變化後0,3,0,0,0,0,0,0

我知道這個問題,但是,我不知道如何解決它。 "MaxDurability" + Item生成一個名爲MaxDurabilityTestItem的字符串,而不是指我的變量MaxDurabilityTestItem

我該如何改變它以便引用我的變量MaxDurabilityTestItem,而不是它創建的這個字符串?

+0

靜態屬性是類的屬性。您可以通過類引用來解決它:ClassReference [StaticPropertyName]。如果你的類名是MyClass,它將是MyClass ['MaxDurabilityTestItem']。 – Organis

+0

爲什麼''MaxDurability「+ Item'?這個'Item'可能會改變嗎? –

+0

是項目將會改變。這個功能是設置項目所在插槽項目的耐久性。 – UnAlpha

回答

1

"MaxDurability" + Item讓因爲你自動使用引號定義的"string"一個名爲MaxDurabilityTestItem串,

。我只能假設Item也是字符串與文本"TestItem"。所以你只需加入 + 兩個 + 字符串在一起。

(2)

...而不是指我的變量MaxDurabilityTestItem

嘗試爲:

UI_Taskbar_Inventory.InventoryDurability[Slot] = MaxDurabilityTestItem; //now using your defined variable 

編輯

萬一你真的想用一個字符串作爲參考變量本身:

使用this[ "name of some var" ]。 ..其中this將目標當前類和["name"]會發現這個指定的變量在當前類中。

嘗試:

if(MaxDurability == 0) 
{ 
    trace("Before change " + UI_Taskbar_Inventory.InventoryDurability); 
    UI_Taskbar_Inventory.InventoryDurability[Slot] = this[ "MaxDurability" + Item ]; 
    trace("After change " + UI_Taskbar_Inventory.InventoryDurability); 
} 
else 
{ trace("not using default durability"); } 
2

的第一件事我要在這裏說的是,儘管下面的所有描述的工作得很好,是訴諸於這種技術威力指示與項目的體系結構的一些深層次問題。那麼,那麼...

ActionScript 3.0的美和醜是從字面上看,任何東西都是其中的一個對象,並且您可以像這樣接近任何實例。

任何類實例都是一個對象。您可以分別將任何DisplayObjectxy作爲['x']和['y']。你可以用同樣的方法處理方法:

function gotoAnd(frame:*, thenPlay:Boolean):void 
{ 
    // Forms 'gotoAndPlay' or 'gotoAndStop' string. 
    var methodName = 'gotoAnd' + (thenPlay? 'Play': 'Stop'); 

    // Gets method reference to either gotoAndPlay or to gotoAndStop. 
    var methodItself:Function = this[methodName]; 

    // Calls method by the reference. 
    methodItself(frame); 

    // In one line: 
    // this['gotoAnd' + (thenPlay? 'Play': 'Stop')](frame); 
} 

任何類也是一個對象。細微的區別在於,作爲對象的類的成員是靜態類方法和字段。例如:

import flash.system.System; 

// Accepts "free" or "private" or "total" as an argument. 
function getMemory(value:String = "total"):Number 
{ 
    var propertyName:String; 

    switch (value) 
    { 
     case "private": 
      propertyName = "privateMemory"; 
      break; 

     case "free": 
      propertyName = "freeMemory"; 
      break; 

     case "total": 
      propertyName = "totalMemoryNumber"; 
      break; 

     // Returns -1 for an invalid argument. 
     default: 
      return -1; 
      break; 
    } 

    // Returns either System.privateMemory 
    // or System.freeMemory or System.totalFreeMemory. 
    return System[propertyName]; 
} 

話又說回來,靜態類的方法是功能類的成員作爲對象:

// Direct method access. 
System.gc(); 

// Property-based method access. 
System['gc'](); 

請記住,[]訪問仍然尊重私人內部保護名稱空間,所以如果你不能訪問SomeObject.someMethod(),因爲該方法被標記爲私人,y ou將無法通過SomeObject ['someMethod']訪問它。前者會給你一個編譯時錯誤,後者會讓你編譯你的應用程序,然後會讓你處理運行時異常。

相關問題