【问题标题】:Haxe Reference Object via StringHaxe 通过字符串引用对象
【发布时间】:2016-05-14 11:18:05
【问题描述】:

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

字符串应该是整数

不允许对 { 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

【问题讨论】:

    标签: haxe


    【解决方案1】:

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

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

    如果您想访问 static 字段,请将 Class<T> 作为第一个参数而不是实例传递:

    class Foo {
        public static var bar = 0;
    }
    
    var bar = Reflect.field(Foo, "bar");
    

    对于带有吸气剂的properties,您需要改用getProperty()


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

    【讨论】:

    • 太棒了!!!,我已经搞砸了 2 天了。很好,谢谢。我会记住,我将来可能不得不改变它的工作方式以使其更健壮,但对于演示版本,这会很好。再次感谢。
    【解决方案2】:

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

    但是,由于您的示例(间接)类型为 room,因此需要进行一些转换,并且您仍然会丢失输入(您将拥有不同类型的“值”,并且需要选择 <Dynamic>):

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

    (full example)

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

    【讨论】:

      【解决方案3】:

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

      var results = untyped room[foo];
      

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

      【讨论】:

      • 谢谢,我会看看这两个选项。
      • 如果你要使用反射,至少使用Reflect API。它比untyped 稍微安全一些,最重要的是跨平台
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2017-08-16
      • 2013-09-30
      • 2015-10-12
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多