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

时间:2017-10-16 04:03:49

标签: actionscript-3 flash actionscript cs3

我不知道如何提出这个问题。

我有一个变量

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

输出

  

在更改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,而不是它创建的字符串?

2 个答案:

答案 0 :(得分:2)

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

ActionScript 3 的美丽和丑陋是字面上任何东西都是其中的对象,您可以这样处理任何实例。

任何类实例都是一个对象。您可以将 DisplayObject x y 分别称为['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];
}

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

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

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

请注意,[]访问仍然尊重私有内部受保护的命名空间,因此如果您无法访问SomeObject.someMethod ()因为该方法标记为私有,您将无法通过SomeObject ['someMethod']访问它。前者会给你一个编译时错误,后者会让你编译你的app然后会让你处理运行时异常。

答案 1 :(得分:1)

  

"MaxDurability" + Item创建一个名为MaxDurabilityTestItem的字符串,

因为您使用引号自动定义了"string"。我只能假设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"); }