如何将数值向量传递给通用向量函数?

How can I pass numeric vectors to generic vector functions?

我注意到 intuintNumber 类型的向量有一些奇怪的行为。下面是一些您可以自己测试的代码:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        private var untypeds:Vector.<*> = new <*>[{}, 7];
        private var objects:Vector.<Object> = new <Object>[{}, {}];
        private var sprites:Vector.<Sprite> = new <Sprite>[new Sprite(), new Sprite()];
        private var events:Vector.<Event> = new <Event>[new Event("1"), new Event("2")];
        private var booleans:Vector.<Boolean> = new <Boolean>[true, false];
        private var strings:Vector.<String> = new <String>["1", "2"];
        private var ints:Vector.<int> = new <int>[-5, -6];
        private var uints:Vector.<uint> = new <uint>[5, 6];
        private var numbers:Vector.<Number> = new <Number>[2.5, 5.2];

        public function Main()
        {
            myFunc("untypeds");
            myFunc("objects");
            myFunc("sprites");
            myFunc("events");
            myFunc("booleans");
            myFunc("strings");
            myFunc("ints");
            myFunc("uints");
            myFunc("numbers");
        }
        // Note that I'm only using a string parameter for tracing purposes.
        // The same results would be seen if the vector was passed directly as an untyped argument.
        private function myFunc(vecName:String):void
        {
            var vec:Vector.<*> = this[vecName] as Vector.<*>;
            trace(vecName + " as Vector.<*>: " + vec + " Same object? " + (vec == this[vecName]));
            vec = Vector.<*>(this[vecName]);
            trace("Vector.<*>(" + vecName + "): " + vec + " Same object? " + (vec == this[vecName]));
        }
    }
}

这是输出:

untypeds as Vector.<*>: [object Object],7 Same object? true
Vector.<*>(untypeds): [object Object],7 Same object? true
objects as Vector.<*>: [object Object],[object Object] Same object? true
Vector.<*>(objects): [object Object],[object Object] Same object? true
sprites as Vector.<*>: [object Sprite],[object Sprite] Same object? true
Vector.<*>(sprites): [object Sprite],[object Sprite] Same object? true
events as Vector.<*>: [Event type="1" bubbles=false cancelable=false eventPhase=2],[Event type="2" bubbles=false cancelable=false eventPhase=2] Same object? true
Vector.<*>(events): [Event type="1" bubbles=false cancelable=false eventPhase=2],[Event type="2" bubbles=false cancelable=false eventPhase=2] Same object? true
booleans as Vector.<*>: true,false Same object? true
Vector.<*>(booleans): true,false Same object? true
strings as Vector.<*>: 1,2 Same object? true
Vector.<*>(strings): 1,2 Same object? true
ints as Vector.<*>: null Same object? false
Vector.<*>(ints): -5,-6 Same object? false
uints as Vector.<*>: null Same object? false
Vector.<*>(uints): 5,6 Same object? false
numbers as Vector.<*>: null Same object? false
Vector.<*>(numbers): 2.5,5.2 Same object? false

请注意,转换为 Vector.<*> 在除 intuintNumber 之外的任何情况下都可以正常工作。在这些情况下,使用全局 Vector() 函数进行转换 returns 向量的副本,并使用 as returns null.

进行转换

有什么方法可以将数值向量传递给旨在修改任何类型向量的函数吗?

编辑:我刚刚在尝试将 Vector.<int> 转换为 Vector.<Number> 时观察到同样的问题,因此为三种数字类型提供额外版本的函数将不起作用。

"Is there any way to pass a numeric vector to a function to modify a vector of any type?"

不知道这是否是您想要的,只是使用通配符 (*) 作为函数的输入参数。这将允许您使用不同的数字类型向量。

var ints:Vector.<int> = new Vector.<int>();
var numbers:Vector.<Number> = new Vector.<Number>();

ints.push( 5, 3, 7 );
numbers.push( -2.8, 1.5, -1.4 );

function vect_Push (input:*) : void
{
    input.push( input[input.length-1] * 2 );
}

function vect_Mixed (inputA:* , inputB:*) : void
{
     inputB[inputB.length-1] = inputA[inputA.length-1] * inputB[inputB.length-1];
}

在上面的代码中...

  • function vect_Push 将采用任何 vectorarray(实际上是响应 .push 方法的任何数据类型)并添加一个新条目。
  • function vect_Mixed 将采用两个混合的 vector 数组(因此 inputA 可能是 ints,而 inputB 可能是 numbers。一个的最后一个条目将与相应的另一个条目相乘。

测试上面的代码...

//#  test for : modify any vector (using Push to add one extra new entry)
trace("Old length ints     : " + ints.length); 
vect_Push(ints); //passing Integer to function
trace("New length ints     : " + ints.length); //should be +1 length
trace("Last new value ints : " + ints[ints.length-1]); //check new entry's value

//# test for : mixed vector types (multply types "int" with "Number")
vect_Mixed(ints, numbers); //passing Integer and Number to function
trace("New mult value numbers[last entry]  : " + numbers[numbers.length-1]);