3

默认情况下,ActionScript 3 通过引用传递数组。我一定是犯了一个菜鸟的错误。这是我的代码的快照:

private function testFunc():void {
    var testArray:Array=new Array();
    myFunction(testArray);
    trace(testArray); // []; length=0
}

private function myFunction(tArray:Array):void {
    tArray = myOtherFunction();
    trace(tArray); // 0, 1, 2; length=3
}

private function myOtherFunction():Array {
    var x:Array=new Array;
    for (var i:int=0; i<3; i++)
       x[i]=i;
    return x;
}

我可以看到这tArray是正确的,但testArray总是空的。知道如何使testArray平等tArray吗?提前致谢。

http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000049.html

更新:

对于它的价值,我发现以下更改(hack)有效:

private function myFunction(tArray:Array):void {
    var Z:Array=new Array;
    Z = myOtherFunction();
    for (var i:int=0; i<Z.length; i++)
        tArray[i]=Z[i];
}

Georgii 的解决方案是更好的设计。

4

3 回答 3

4

当您将 testArray 作为参数传递给 myFunction 时,它的引用被复制并分配给本地引用 tArray,这样 myFunction 内部的 tArray 指向与 testArray 相同的对象,但实际上是不同的引用。这就是为什么当您更改 tArray 引用时, testArray 本身不会更改。

private function testFunc():void {
    var testArray:Array=new Array(); 
    // testArray is a local variable, 
    // its value is a reference to an Array object
    myFunction(testArray);
    trace(testArray); // []; length=0
}

private function myFunction(tArray:Array):void {
    // tArray is a local variable, which value equals to testArray
    tArray = myOtherFunction(); 
    // now you changed it and tArray no longer points to the old array
    // however testArray inside of testFunc stays the same
    trace(tArray); // 0, 1, 2; length=3
}

你可能想要的是:

private function testFunc():void {
    var testArray:Array=new Array();
    testArray = myFunction(testArray);
    trace(testArray); // 0, 1, 2; length=3
}

private function myFunction(tArray:Array):Array {
    // do what you want with tArray
    tArray = myOtherFunction();
    trace(tArray); // 0, 1, 2; length=3
    // return new value of the tArray
    return tArray;
}

private function myOtherFunction():Array {
    var x:Array=new Array;
    for (var i:int=0; i<3; i++)
       x[i]=i;
    return x;
}
于 2013-01-30T03:45:34.437 回答
2

基本上发生的事情是您已将 Array 传递给函数,该函数又创建了对它的本地引用(在函数内)。

这意味着,如果您决定继续并将新创建的 Array 分配给局部变量(tArray在您的情况下),它将被使用,而原始实例将保留其原始实例。

这对于任何对象都是一样的,例如对于 Sprite:

var sprite:Sprite = new Sprite();

// We set the original Sprite's x to 10.
sprite.x = 10;

function mutilate(subject:Sprite):void
{
    // Notice here how we are making a new instance. This won't assign a new
    // instance to the "sprite" property that we've passed here, but rather
    // a new instance to the local variable "subject".
    subject = new Sprite();

    // And here we set the x of the new instance to 20.
    subject.x = 20;
}


mutilate(sprite);
trace(sprite.x); // Outputs 10, though you may have expected 20.
于 2013-01-30T03:51:13.550 回答
0

返回 myOtherFunction() 遍历它,然后为每个元素调用 tArray.push() 。目前,您所做的只是更改对新创建对象的本地引用。

您需要将元素添加到原始数组中,您在分配时也会丢失引用。

于 2013-01-30T04:01:48.750 回答