如何在由Point索引的actionscript中创建关联数组?

问题描述:

我想我的关联数组索引Point(或,一般来说,Object)具有语义相等。不幸的是如何在由Point索引的actionscript中创建关联数组?

var p:Point = new Point(1, 1); 
var q:Point = new Point(1, 1); 

var dict:Dictionary = new Dictionary(); 
dict[p] = 5; 
trace(dict[p]); // => 5 
trace(dict[q]); // => undefined 

因为

trace(p===q); // => false 

有没有办法告诉Dictionary如何订购它的钥匙,还是有不同的类中使用了这种类型的事情?

很显然,如果你使用Object,似乎打算工作:

var p:Point = new Point(1, 1); 
var q:Point = new Point(1, 1); 
var r:Point = new Point(1, 2); 

var dict:Object = new Object(); 
dict[p] = 5; 
trace(dict[p]); // => 5 
trace(dict[q]); // => 5 
trace(dict[r]); // => undefined 
+0

我还没有试过这个,这只是一个预感,但你肯定*这个工程?我怀疑它可能会在p上进行字符串转换,然后将其用作索引,因此所有点都会发生碰撞。 – grapefrukt 2009-09-02 17:29:26

+0

我相信Object的键只是字符串,所以你用作键的任何非String对象都会被转换为一个字符串。 Object的toString()方法返回相同的内容,不管它的内容如何,​​所以这很可能不起作用。 – Herms 2009-09-02 18:21:37

+0

它似乎。请参阅编辑 – 2009-09-02 23:01:38

一个Dictionary将放置物体不同箱,即使他们是“平等”。如果用作键的两个对象导致插入时发生冲突,则字典将简单地使用下一个可用的容器来放置第二个对象,因为如您所说,p!==q。但使用Object(本质上它仍然是一张地图)是不同的,它只会检查是否p.equals(q)

+0

实际上,'Object'必须*不*检查'p == q',因为在这种情况下,它是错误的! (但'p.equals(q)'是真的) – 2009-09-02 23:05:55

+0

可能已经发誓它回到我的真实。呃,没什么大不了的;反正不应该使用'=='。 – geowa4 2009-09-03 14:07:56