如何在不创建新变量的情况下引用现有变量?

How to refer to existing variable(s) without creating a new one?

我不知道怎么问这个问题。

我有一个变量

public static var MaxDurabilityTestItem:Number = 3;

我有一个功能

    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

输出

Before change 0,0,0,0,0,0,0,0

After change 0,MaxDurabilityTestItem,0,0,0,0,0,0

虽然我想要它输出

Before change 0,0,0,0,0,0,0,0

After change 0,3,0,0,0,0,0,0

我知道这个问题,但是我不知道如何解决。 "MaxDurability" + Item 生成一个名为 MaxDurabilityTestItem 的字符串,而不是引用我的变量 MaxDurabilityTestItem.

我如何更改它以使其引用我的变量 MaxDurabilityTestItem,而不是它创建的这个字符串?

"MaxDurability" + Item makes a string called MaxDurabilityTestItem,

因为您使用引号自动定义了 "string"。我只能假设 Item 也是带有文本 "TestItem" 的字符串。所以你只是 joined+two+strings 在一起。

(2)

...rather than referring to my variable MaxDurabilityTestItem.

尝试为:

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

编辑 :

以防万一你真的想使用字符串作为对变量本身的引用:

使用 this[ "name of some var" ]... 其中 this 将以当前 class 为目标,而 ["name"] 将在当前 class 中找到此类指定变量。

尝试:

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"); }

我要在这里说的第一件事是,尽管下面描述的一切都很好,但诉诸这些技术可能表明项目架构存在一些深层次的问题。那么...

ActionScript 3 的美与丑在于,从字面上看,任何东西都是其中的对象,您可以像这样处理任何实例。

任何class实例都是对象。您可以将任何 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);
}

任何 class 也是一个对象。细微的区别在于,作为对象的 class 的成员是静态 class 方法和字段。例如:

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];
}

然后,静态 class 方法是 Function 作为对象的 class 成员:

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

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

请记住,[] 访问仍然尊重 privateinternalprotected 命名空间,因此如果您无法访问 SomeObject.someMethod() 因为该方法被标记为 private,您将无法通过 SomeObject['someMethod'] 访问它任何一个。前者会给你一个编译时错误,后者会让你编译你的应用程序然后让你处理运行时异常。