haxe将新关键字添加到具有变量的对象

Fer*_*177 2 haxe

我定义了一个对象数据,用于存储代码中使用的各种数据。我想在运行时插入一个新房间。例如,来自变量的新键“ 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的匿名结构无非是无类型的,有组织的数据集合。一旦设置,它们的结构是不可变的,并且只能修改属性值。未在匿名结构上定义数组访问(方括号表示法),而是使用点表示法。

由于匿名结构的无类型(动态)性质,当编译为静态目标时,它们可能会对性能产生负面影响

建议使用typedeftypedef扩展来组织和键入匿名结构。这样可以确保类型安全,并帮助编译服务器随时随地查找任何键入错误。

准确地说,要使用的方法最好是使用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源代码。

就个人而言,我认为反思不是解决您问题的可接受方法。我认为您的问题是找到合适的数据结构来表示您的数据之一。反射有其用处,但在这种情况下,我不建议这样做。