Haxe参考对象通过字符串

时间:2016-05-14 11:18:05

标签: haxe

在Haxe中,我试图通过变量访问对象的值。在JavaScript中,您使用[ ]来访问它,但在Haxe中,这不起作用并返回错误:

  

字符串应为Int

     

{x:Int,name:String}

上不允许进行数组访问

我需要最后一行代码的帮助:

var room = { x: 10, name: 'test' };

trace(room.name);   // this works returns 'test' 

// how do I reference foo to return 'test' as the above result.
var foo = "name";
var results = room[foo];   // need fixing

3 个答案:

答案 0 :(得分:5)

您尝试做的事情称为Reflection,在Haxe中执行此操作的方法是通过Reflect API:

var results = Reflect.field(room, "name");

注意:反射通常被认为是不好的做法,因为它会将错误从编译移动到运行时,并且本质上是类型不安全的。有通常更好的方法来解决问题,但是如果没有更多的背景,很难在这里推荐具体的解决方案。

答案 1 :(得分:1)

您也可以使用haxe.DynamicAccess。如果您的对象是haxe.Json.parse的结果,或者通过其他方式Dynamic,则此功能特别有用。

但是,由于您的示例(间接)键入room,因此需要进行一些转换,并且您仍然会松开键入内容(您将拥有&#34;值&#34;具有不同的类型和将需要解决<Dynamic>):

    var foo = "name";
    var access = (cast room:haxe.DynamicAccess<Dynamic>);
    trace(access[foo]);

full example

如果您的用例具有可以转换为String -> T地图的类型结构,或者如果您已经处理动态,那么这是一个很好的选择;否则,Reflectuntyped会更简单,因此更好。

答案 2 :(得分:0)

您也可以使用无类型。 例如:

var results = untyped room[foo];

使用无类型时,您需要小心,因为如果您没有进行适当的运行时检查,它可能会导致运行时错误。