我不知道如何提出这个问题。
我有一个变量
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,而不是它创建的字符串?
答案 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"); }