【问题标题】:Can you navigate the contents of a Vector's index via a String?您可以通过字符串导航 Vector 索引的内容吗?
【发布时间】:2017-11-14 19:54:35
【问题描述】:

是否可以在 Haxe 中做类似的事情?

private var _bindingsFiltered:Vector<String>;
_bindingsFiltered = new Vector<String>();

_controller_touched_binding.action = "meta_start";

我想做的事:

_bindingsFiltered[_controller_touched_binding.action] = "BUTTON_13";
trace(_bindingsFiltered["meta_start"]); //result: "BUTTON_13"

我也希望能够使用新值覆盖特定索引(仍然通过字符串访问),而不是不断将新内容推送到向量的末尾。我现在一直在使用“openfl.utils.Object”作弊,但从长远来看,我正在寻找一种更可靠的方法。

有没有办法在 Haxe 中做到这一点?

如果没有,我有什么选择?

我也会对 AS3 中的解决方案感兴趣,如果有的话(避免使用 Array 类)。

我的目标是找到一种可以在两种语言中无缝使用的方法(几乎没有差异)。

【问题讨论】:

  • 这里有一些非常好的答案。您可能想将其中一个标记为已接受? :)

标签: actionscript-3 haxe


【解决方案1】:

在 Haxe 中向量不能被字符串索引。向量是具有固定大小的数组。 This is the Haxe manual on that subject.

你可以用Map.代替向量

class Test {

    private var vector:Map<String, String> = new Map<String, String>();

    public function new() {
        var str = 'haxe';

        vector[str] = "is great";
        trace(vector[str]);
    }

    static function main() {
        new Test();
    }
}

https://try.haxe.org/#F74Ba

【讨论】:

    【解决方案2】:

    我认为你可以使用flash.utils.Dictionary

    动作脚本

    import flash.utils.Dictionary;
    
    ...
    
    var _bindingsFiltered:Dictionary = new Dictionary ();
    
    _bindingsFiltered[_controller_touched_binding.action] = "BUTTON_13";
    trace(_bindingsFiltered["meta_start"]); //result: "BUTTON_13"
    

    斧头

    import openfl.utils.Dictionary;
    
    ...
    
    var _bindingsFiltered = new Dictionary<String, String> ();
    
    _bindingsFiltered[_controller_touched_binding.action] = "BUTTON_13";
    trace(_bindingsFiltered["meta_start"]); //result: "BUTTON_13"
    

    【讨论】:

    • 我忘了提到我想在列表填充后迭代/循环,这可以通过两种语言的 Dictionary 类实现吗?
    • 是的,应该是这样的:for (key in _bindingsFiltered) { trace (key); trace (_bindingsFiltered[key]); }
    【解决方案3】:

    首先,你真的想要一个数组/向量/列表,还是你真的想要一个键/值对的哈希图?您如何使用该系列?为什么要字符串键?和相关的是,这主要是关于访问语义(你想以这种方式输入),还是你想使用字符串的运行时原因(序列化 / 等)?

    根据您的描述,听起来您真正想要的是 Object,就像 AS3/JS/ECMAScript 中的那样,带有方括号访问语义 -- obj[key]

    是的,您可以在 Haxe 中做到这一点。 openfl.utils.Object 类是使用动态对象和反射来完成此任务的助手。它应该在所有 Haxe 目标上完全编译为您想要的。

    无论如何,如果您希望自己不受 OpenFL 约束,没问题。复制 openfl/utils/Object.hx 文件并将其放在项目类路径中您喜欢的任何位置(并更新 package 语句)。

    that code 并没有什么特别的 OpenFL 风格。它是没有依赖关系的纯 Haxe 代码。它通过String 键以及toStringtoLocaleStringpropertyIsEnumerableiteratorisPrototypeOfhasOwnProperty 函数(ECMA-folk 习惯于)提供数组访问。

    从 AS3/JS 到 Haxe 的过渡有点奇怪,尤其是在涉及到动态对象时,我一直想在博客上写更多关于它的内容。 ;) 祝你好运!

    预计到达时间:事实上,您可能希望摆脱动态/反射,并采用更严格类型的方法。 AS3/JS 开发人员起初并不理解这一点,但这正是 Haxe 的优势所在。如果您不这样做,那么您的 Haxe 体验可能会很不愉快。

    【讨论】:

    • 我计划存储两件事:控制器上的按钮和将与按钮配对的组成术语(两者类型:字符串)。例如“BUTTON_13”将与虚构的术语“meta_start”配对,稍后将用作动作触发器,以输入任何类型的代码块。如果用户决定他们不喜欢此映射,他们可以随时更改它,但我不想从将存储这些对的列表中推送和弹出元素。我稍后还希望能够循环/迭代列表的长度,以将对(映射)导出到文件(类型:json)。
    【解决方案4】:

    简短的回答:是的,你可以。

    abstract MyVector<T>(Vector<T>) {
    public function new(l:Int) this = new Vector<T>(l);
    @:op([]) public function set<K:T>(s:String, v:K) {
        switch (s) {
            case "FIRST": this[0] = v;
            case "SECOND": this[1] = v;
            default: return;
        }
    }
    @:op([]) public function get(s:String) {
        switch (s) {
            case "FIRST": return this[0];
            case "SECOND": return this[1];
            default: return cast 0;
        }
     }
    

    }

        var mv = new MyVector<String>(2);
        mv["SECOND"] = "Second";
        trace(mv["SECOND"]); // outputs Second
    

    如果需要,您可以内联 get 和 set 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2013-03-15
      相关资源
      最近更新 更多