如何在不创建新变量的情况下引用现有变量?
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实例都是对象。您可以将任何 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);
}
任何 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']();
请记住,[] 访问仍然尊重 private、internal 和 protected 命名空间,因此如果您无法访问 SomeObject.someMethod() 因为该方法被标记为 private,您将无法通过 SomeObject['someMethod'] 访问它任何一个。前者会给你一个编译时错误,后者会让你编译你的应用程序然后让你处理运行时异常。
我不知道怎么问这个问题。
我有一个变量
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 calledMaxDurabilityTestItem
,
因为您使用引号自动定义了 "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实例都是对象。您可以将任何 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);
}
任何 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']();
请记住,[] 访问仍然尊重 private、internal 和 protected 命名空间,因此如果您无法访问 SomeObject.someMethod() 因为该方法被标记为 private,您将无法通过 SomeObject['someMethod'] 访问它任何一个。前者会给你一个编译时错误,后者会让你编译你的应用程序然后让你处理运行时异常。