在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
答案 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]);
如果您的用例具有可以转换为String -> T
地图的类型结构,或者如果您已经处理动态,那么这是一个很好的选择;否则,Reflect
或untyped
会更简单,因此更好。
答案 2 :(得分:0)
您也可以使用无类型。 例如:
var results = untyped room[foo];
使用无类型时,您需要小心,因为如果您没有进行适当的运行时检查,它可能会导致运行时错误。