您可以通过字符串导航 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();
}
}
首先,你真的想要一个数组/向量/列表,还是你真的想要一个键/值对的hashmap?您如何使用该系列?你为什么要字符串键?与此相关的是,这主要是关于访问语法(您想以这种方式输入),还是您想要使用字符串(序列化等)的运行时原因?
根据您的描述,听起来您真正想要的是像 AS3/JS/ECMAScript 中那样的 Object
,带有方括号访问语法 -- obj[key]
是的,您可以在 Haxe 中做到这一点。 openfl.utils.Object
class 是使用动态对象和反射来完成此操作的助手。它应该在所有 Haxe 目标上编译成您想要的。
无论如何,如果您想感觉自己不受 OpenFL 的束缚,没问题。复制 openfl/utils/Object.hx
文件并将其放置在项目 class 路径中的任意位置(并更新包语句)。
that code 没有什么特别的 OpenFL 风格。它是没有依赖关系的纯 Haxe 代码。它提供使用 String
键以及 toString
、toLocaleString
、propertyIsEnumerable
、iterator
、isPrototypeOf
和 [=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 方法。
是否可以在 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();
}
}
首先,你真的想要一个数组/向量/列表,还是你真的想要一个键/值对的hashmap?您如何使用该系列?你为什么要字符串键?与此相关的是,这主要是关于访问语法(您想以这种方式输入),还是您想要使用字符串(序列化等)的运行时原因?
根据您的描述,听起来您真正想要的是像 AS3/JS/ECMAScript 中那样的 Object
,带有方括号访问语法 -- obj[key]
是的,您可以在 Haxe 中做到这一点。 openfl.utils.Object
class 是使用动态对象和反射来完成此操作的助手。它应该在所有 Haxe 目标上编译成您想要的。
无论如何,如果您想感觉自己不受 OpenFL 的束缚,没问题。复制 openfl/utils/Object.hx
文件并将其放置在项目 class 路径中的任意位置(并更新包语句)。
that code 没有什么特别的 OpenFL 风格。它是没有依赖关系的纯 Haxe 代码。它提供使用 String
键以及 toString
、toLocaleString
、propertyIsEnumerable
、iterator
、isPrototypeOf
和 [=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 方法。