使用新的但相同值的密钥使用 object 密钥访问 Haxe 地图
Haxe map access with object keys using new but same value key
标题有点乱。但是让我解释一下我的问题。
让我们假装有一个叫 MyObj
的 class。这个 MyObj
有一个 hashCode()
函数,该函数生成一个 Int
哈希码以与 Haxe 地图一起作为键使用。像这样:
var mymap = new Map<MyObj,String>();
var myobj = new MyObj(my,params);
mymap[myobj] = "whatever";
trace(mymap[myobj]); // works great and can print "whatever" from map
以上效果很好。然而;当映射到具有相同参数的新 object 时,它不起作用。
trace(mymap[new MyObj(my,params)]); // does not work, returns null
打印并检查整个地图 (trace(mymap)
) 时,似乎用作键的每个 "new" object 实际上是一个新的 "id" 或"hashcode"(Haxe 在幕后所做的一切)。
我什至在 MyObj
中重载了等号运算符(可以是抽象类型)。
问题是,如何使用包含相同值的不同 object 从地图中检索元素,如上所述。
如何制作这样的作品:
mymap[new MyObj(my,params)]
难道 hashCode
不需要使用 haxe.ds.HashMap
而不是 Map
吗?
由于它们是独立的个体对象,因此这种行为是意料之中的。
要实现所需的行为,您可以
在定义访问器、序列化和反序列化对象键时,从 Map<MyObj,String>
创建一个内部为 Map<String,String>
的新抽象类型。
提供@theRemix 答案的替代方案:您可能需要考虑使用 polygonal-ds 库。它通过其 HashTable
和 Hashable
界面支持您的需求。这是一个简单的用法示例:
import de.polygonal.ds.HashTable;
import de.polygonal.ds.Hashable;
class Main {
public static function main() {
var table = new HashTable<MyObj, String>(16);
table.set(new MyObj(5), "FirstObject");
table.set(new MyObj(2), "SecondObject");
trace(table.get(new MyObj(5))); // "FirstObject"
trace(table.get(new MyObj(0))); // null
}
}
class MyObj implements Hashable {
public var key(default, null):Int;
public function new(key:Int) {
this.key = key;
}
}
有一个缺点:HashTable
是一个class,不是抽象,所以它不支持数组访问。
标题有点乱。但是让我解释一下我的问题。
让我们假装有一个叫 MyObj
的 class。这个 MyObj
有一个 hashCode()
函数,该函数生成一个 Int
哈希码以与 Haxe 地图一起作为键使用。像这样:
var mymap = new Map<MyObj,String>();
var myobj = new MyObj(my,params);
mymap[myobj] = "whatever";
trace(mymap[myobj]); // works great and can print "whatever" from map
以上效果很好。然而;当映射到具有相同参数的新 object 时,它不起作用。
trace(mymap[new MyObj(my,params)]); // does not work, returns null
打印并检查整个地图 (trace(mymap)
) 时,似乎用作键的每个 "new" object 实际上是一个新的 "id" 或"hashcode"(Haxe 在幕后所做的一切)。
我什至在 MyObj
中重载了等号运算符(可以是抽象类型)。
问题是,如何使用包含相同值的不同 object 从地图中检索元素,如上所述。
如何制作这样的作品:
mymap[new MyObj(my,params)]
难道 hashCode
不需要使用 haxe.ds.HashMap
而不是 Map
吗?
由于它们是独立的个体对象,因此这种行为是意料之中的。 要实现所需的行为,您可以
在定义访问器、序列化和反序列化对象键时,从 Map<MyObj,String>
创建一个内部为 Map<String,String>
的新抽象类型。
提供@theRemix 答案的替代方案:您可能需要考虑使用 polygonal-ds 库。它通过其 HashTable
和 Hashable
界面支持您的需求。这是一个简单的用法示例:
import de.polygonal.ds.HashTable;
import de.polygonal.ds.Hashable;
class Main {
public static function main() {
var table = new HashTable<MyObj, String>(16);
table.set(new MyObj(5), "FirstObject");
table.set(new MyObj(2), "SecondObject");
trace(table.get(new MyObj(5))); // "FirstObject"
trace(table.get(new MyObj(0))); // null
}
}
class MyObj implements Hashable {
public var key(default, null):Int;
public function new(key:Int) {
this.key = key;
}
}
有一个缺点:HashTable
是一个class,不是抽象,所以它不支持数组访问。