你能通过字符串导航Vector索引的内容吗?

时间:2017-11-14 19:54:35

标签: actionscript-3 haxe

是否有可能在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类)。

我的目标是找到一种方法,我可以无缝地使用这两种语言(无与伦比,差异)。

4 个答案:

答案 0 :(得分:2)

在Haxe中,不能通过字符串索引Vector。向量是具有固定大小的数组。 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

答案 1 :(得分:0)

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

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

是的,你可以在Haxe那样做。 openfl.utils.Object类是使用动态对象和反射完成此操作的助手。它应该编译为你想要的所有Haxe目标。

无论如何,如果你觉得自己不喜欢OpenFL,那没问题。复制openfl/utils/Object.hx文件并将其放在项目的类路径中(并更新包语句)。

关于that code,没有什么特别的OpenFL-ish。它是纯粹的Haxe代码,没有依赖关系。它使用String个密钥提供数组访问权限,以及toStringtoLocaleStringpropertyIsEnumerableiteratorisPrototypeOf和{{1}函数(ECMA-folk习惯了。)

从AS3 / JS到Haxe的过渡有点奇怪,特别是涉及到动态对象时,我有意在博客上发表更多相关信息。 ;)祝你好运!

ETA:事实上,您可能希望摆脱Dynamic / Reflection,并采用更严格的方法。 AS3 / JS开发人员一开始并不了解这一点,但这是Haxe带来的好处。如果你没有,那么你的Haxe体验很可能是无法获得的。

答案 2 :(得分:0)

我认为您可以使用flash.utils.Dictionary执行此操作:

的ActionScript

import flash.utils.Dictionary;

...

var _bindingsFiltered:Dictionary = new Dictionary ();

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

HAXE

import openfl.utils.Dictionary;

...

var _bindingsFiltered = new Dictionary<String, String> ();

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

答案 3 :(得分:0)

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

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

如果需要,您可以内联获取和设置方法。