是否有可能在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类)。
我的目标是找到一种方法,我可以无缝地使用这两种语言(无与伦比,差异)。
答案 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();
}
}
答案 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
个密钥提供数组访问权限,以及toString
,toLocaleString
,propertyIsEnumerable
,iterator
,isPrototypeOf
和{{1}函数(ECMA-folk习惯了。)
从AS3 / JS到Haxe的过渡有点奇怪,特别是涉及到动态对象时,我有意在博客上发表更多相关信息。 ;)祝你好运!
ETA:事实上,您可能希望摆脱Dynamic / Reflection,并采用更严格的方法。 AS3 / JS开发人员一开始并不了解这一点,但这是Haxe带来的好处。如果你没有,那么你的Haxe体验很可能是无法获得的。
答案 2 :(得分:0)
我认为您可以使用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"
答案 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
如果需要,您可以内联获取和设置方法。