gpt4 book ai didi

actionscript-3 - 如何测试对象是否为向量?

转载 作者:行者123 更新时间:2023-12-04 06:43:56 25 4
gpt4 key购买 nike

我想测试一个对象是否是向量,任何向量,而不仅仅是单一类型的向量。

我进行了一个测试:

var v:Vector.<int> = new Vector.<int>();
v.push(3);
v.push(1);
v.push(2);
trace(v is Array); // false
trace(v is Vector); // false
trace(v is Vector.<int>); // true
trace(v is Vector.<*>); // false

似乎唯一返回 true 的是指定向量类型的那个,但我想测试它的任何类型。

我需要一种非常有效的方法来进行比较,因为 getQualifiedClassName太慢了。

我目前的做法是:
private static function isVector(obj:Object):Boolean {
return (getQualifiedClassName(obj).indexOf('__AS3__.vec::Vector') == 0);
}

但它比 is 慢 2 倍运算符(operator)。

我需要速度,因为它用于对象序列化类,并且需要非常快。

最佳答案

问题在于 Vector.<*> 与用于 的类不同。数字基元具有特殊的类以提高效率。 String 和 Boolean 也是基元,但与数字基元不同,它们由 <*> 检测。因此,您只需要测试通用 Vector 和 3 种数字类型。

在对象不是 Vector 或 Vector. 的最坏情况下,此解决方案比 getQualifiedClassName 快 2 倍以上,如果对象是非原始基类型 Vector(如 Vector)则快 5 倍.<对象>:

return (obj is Vector.<*> 
|| obj is Vector.<Number>
|| obj is Vector.<int>
|| obj is Vector.<uint>);

这是一个简单的测试:
var moo:Vector.<uint> = new Vector.<uint>();
var timer:Timer = new Timer();
var b:Boolean;
timer.startTimer();
for (var i:int = 0; i < 1000000; i++)
{
b = (moo is Vector.<*>
|| moo is Vector.<Number>
|| moo is Vector.<int>
|| moo is Vector.<uint>);
}
logger.info(" is timer: " + timer.endTimer());

timer.startTimer();
for (i = 0; i < 1000000; i++)
{
b = (flash.utils.getQualifiedClassName(moo).indexOf('__AS3__.vec::Vector') == 0);
}
logger.info("gqcn timer: " + timer.endTimer());


[LOG] com.tcg.test: is timer: 320
[LOG] com.tcg.test: gqcn timer: 756

将 moo 更改为 Vector. :
[LOG] com.tcg.test:   is timer: 158
[LOG] com.tcg.test: gqcn timer: 743

关于actionscript-3 - 如何测试对象是否为向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com