您可以通过字符串导航 Vector 索引的内容吗?

Can you navigate the contents of a Vector's index via a String?

是否可以在 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 中的解决方案感兴趣,如果有的话(避免数组 class)。

我的目标是找到一种可以在两种语言中无缝使用的方法(仅次于-none,差异)。

在 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

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

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

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

无论如何,如果您想感觉自己不受 OpenFL 的束缚,没问题。复制 openfl/utils/Object.hx 文件并将其放置在项目 class 路径中的任意位置(并更新包语句)。

that code 没有什么特别的 OpenFL 风格。它是没有依赖关系的纯 Haxe 代码。它提供使用 String 键以及 toStringtoLocaleStringpropertyIsEnumerableiteratorisPrototypeOf 和 [=20= 的数组访问] 函数(ECMA-folk 已经习惯了。)

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

ETA: 实际上,您可能想要摆脱 Dynamic/Reflection,并采用更严格的类型方法。 AS3/JS 开发人员一开始并不理解这一点,但这正是 Haxe 的优势所在。如果您不这样做,那么您的 Haxe 体验可能会令人不快。

我想你可以使用 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"

简答:可以。

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 方法。