我定义了一个对象数据,用于存储代码中使用的各种数据。我想在运行时插入一个新房间。例如,来自变量的新键“ R200”,但到目前为止尚未成功。
static public var data =
{
room: {
"R100": {monstersLeft: 2 }
}
}
// need to add the the object data :
// would like to reference is like:
var newRoom = "R200";
???? data[newRoom ].monstersLeft = 5;
trace(data.R200.monstersLeft)
Run Code Online (Sandbox Code Playgroud)
小智 6
Haxe的匿名结构无非是无类型的,有组织的数据集合。一旦设置,它们的结构是不可变的,并且只能修改属性值。未在匿名结构上定义数组访问(方括号表示法),而是使用点表示法。
由于匿名结构的无类型(动态)性质,当编译为静态目标时,它们可能会对性能产生负面影响。
建议使用typedef和typedef扩展来组织和键入匿名结构。这样可以确保类型安全,并帮助编译服务器随时随地查找任何键入错误。
准确地说,要使用的方法最好是使用map和typedef。映射使您可以通过方法和方括号表示法来存储适当的键值对,而typedefs则使您可以键入数据结构,从而确保类型安全。
考虑到这一点,可以按如下方式重新创建您的代码段:
class Test {
static var data : Map<String, Room> = new Map<String, Room>();
static function main() {
data["R100"] = { monsterCount: 5 };
data["R200"] = { monsterCount: 10 };
trace(data["R100"].monsterCount);
trace(data["R200"].monsterCount);
}
}
typedef Room = {
var monsterCount : Int;
}
Run Code Online (Sandbox Code Playgroud)
Room现在,它是由{ "monsterCount": (Int) }数据结构描述的一种类型,并映射到表示房间ID的字符串键。
Map API可让您从地图中设置和删除键/值对,以及遍历键/值等。确保检查API文档以获取更多信息。
编辑(2016-07-26)
lordkryss提供的答案完全正确。但是,我没有提出反思的主要原因有两个。
通常,您应该更好地反映动态目标而不是静态目标。在开发项目并确定目标平台是什么时,请记住这一点。
我建议调查生成的源,以更好地了解反射的影响。您可以使用官方的try.haxe.org沙箱查看Haxe 3.2.0生成的JavaScript源代码。还有一个非官方的沙箱,它也使您可以看到Haxe 3.3.0-rc.1生成的JavaScript源代码。
就个人而言,我认为反思不是解决您问题的可接受方法。我认为您的问题是找到合适的数据结构来表示您的数据之一。反射有其用处,但在这种情况下,我不建议这样做。