【问题标题】:How to refer to existing variable(s) without creating a new one?如何在不创建新变量的情况下引用现有变量?
【发布时间】:2018-03-27 12:42:45
【问题描述】:

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

我有一个变量

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

【问题讨论】:

  • 静态属性是类的属性。您可以通过类引用来解决它:ClassReference[StaticPropertyName]。如果您的班级名称是 MyClass,它将是 MyClass['MaxDurabilityTestItem']。
  • 为什么是"MaxDurability" + ItemItem 可能会改变吗?
  • 是的 项目将会改变。该功能是为物品所在的槽位设置物品的耐久度。
  • @Organis 我意识到我的问题已得到解答,但要扩展 ClassReference[StaticPropertyName] 部分,函数将如何完成?我试过 ItemHandling[Item + "Effect"]; - 但是(1.)它不起作用,并且(2.)我不知道把括号放在哪里——也就是说,如果你完全应该这样做的话。 (本例中函数名称为TestItemEffect)
  • @UnAlpha 好的,我在下面发布了一些解释。

标签: actionscript-3 flash actionscript cs3


【解决方案1】:

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

ActionScript 3 的美与丑在于,实际上任何事物都是其中的对象,您可以这样处理任何实例。

任何类实例都是对象。您可以将任何 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']();

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多