我想使用ObjectUtil.compare()比较两个词典。当字典相同时(两个不同的实例,但内容相同),比较失败并出现一个奇怪的例外:
Error #1034: Type Coercion failed: cannot convert "some_key" to QName.
这里有一些代码可以让它更清晰。
Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<local:MainTest xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*"/>
MainTest.as
package {
import spark.components.Application;
import flash.utils.Dictionary;
import mx.utils.ObjectUtil;
public class MainTest extends Application {
public function MainTest() {
super();
trace(ObjectUtil.compare(getMyDictionary(), getMyDictionary()));
}
private function getMyDictionary() : Dictionary {
var myDictionary : Dictionary = new Dictionary();
myDictionary["oranges"] = "orange";
myDictionary["kiwis"] = "green";
return myDictionary;
}
}
}
如您所见,构造函数使用两个词典调用ObjectUtil.compare
。 getMyDictionary()
方法显然每次返回新的,相同的词典(当然,不同的实例,但它们是相同的)。当代码到达ObjectUtil.compare()
时,调试器会输出以下错误:
Error #1034: Type Coercion failed: cannot convert "oranges" to QName.
为什么要将“oranges”键与QName进行比较?
注意:如果我调用ObjectUtil.compare
给出与参数相同的实例,它就可以正常工作。我的意思是,如果我将getMyDictionary()
的返回值保存到变量myDict
并调用ObjectUtil.compare(myDict, myDict)
,则错误将不会出现,并且比较将会通过。
任何人都能解开一些光明吗?我做错了吗?
答案 0 :(得分:1)
这是Flex sdk中的一个错误。
如果您不打算使用Object
以外的任何密钥类型,请使用Dictionary
代替String
。
private function getMyDictionary() : Object {
var myDictionary : Object = new Object();
myDictionary["oranges"] = "orange";
myDictionary["kiwis"] = "green";
return myDictionary;
}
答案 1 :(得分:0)
通过我发现的文档后,可能会有所帮助
mx.utils.ObjectUtil.compare(a:Object,b:Object,depth:int = -1):int
比较对象并返回一个整数值,指示是否 第一项小于或等于第二项。这个 方法将递归地比较嵌套对象的属性和意志 一旦找到非零结果就返回。默认情况下这种方法 将递归至任何财产的最深层次。改变深度 为比较指定深度参数的非负值。 参数:一个对象。 b对象。 depth指示应该有多少级别 在执行比较时被递归。为a设置此值为0 浅比较每个的原始表示 属性。
例如:
var a:Object = {name:"Bob", info:[1,2,3]};
var b:Object = {name:"Alice", info:[5,6,7]};
var c:int = ObjectUtil.compare(a, b, 0);
在上面的例子中,a和b的复杂属性将是 在进行比较时通过调用toString()来展平。在这 如果执行时,info属性将变为字符串 比较。
返回:
如果a和b为null,NaN或相等,则返回0。如果a为null,则返回1 或大于b。如果b为null或大于a。
,则返回-1语言版本:3.0
播放器版本:Flash 9,AIR 1.1
产品版本:Flex 3