0

私はずっと前にこのコードを書いていて、その時は理解できたと思っていましたが、今はそれがどのように機能するかについて頭を悩ませようとしています...

// Main.as

package {
    public class Main {

        public function Main() {
            var fruit:Array = [];
            UpdateClass.update(fruit);
            trace(fruit); // Traces out the string pushed into it? How??? I think the data would've got lost...
        }

    }
}

// UpdateClass.as

package {
    public class UpdateClass {

        public static function update(array:Array):void {
            array.push("haha, this is not a fruit!");
        }

    }
}

UpdateClass がメインのフルーツ配列を更新する方法がわかりませんか? 新しい配列が返されないため、データが失われると思いますか?... Strings と Numbers でこれを試すと、期待どおりにデータが失われます。

これを書いたときに何をしていたのかはわかりませんが、この背後にある論理を理解しようと思います.

ありがとうございました。

4

2 に答える 2

1

StringNumberは AS3 の「プリミティブ」データ型であり、Arrayと のような他のオブジェクトMovieClipは「複合」または「参照」データ型です。

プリミティブを渡すと、その値がコピーされるため、それを変更しても元の値には影響しません。複雑なオブジェクトを渡すと、実際にはメモリ内のオブジェクトのアドレスへの参照であるため、関数は元のオブジェクトを変更しています。

于 2013-01-27T13:55:53.810 に答える
0

String と Number で値が失われたと言うとき、次のようなことを想定しています。

// UpdateClass.as

package {
    public class UpdateClass {

        public static function update(num:Number):void {
            num = 1;
        }

    }
}

失われた理由は、元のオブジェクトへの参照を num として取得したためです。しかし、関数の更新により、値「1」を含む別の Number オブジェクトへの参照が変更されました。次のように、渡された参照に別の配列を割り当てると、これは配列にも当てはまります。

// UpdateClass.as

package {
    public class UpdateClass {
        public static function update(array:Array):void {
            array = new Array();
            array.push("haha, this is not a fruit!");
        }

    }
}

ただし、渡された参照 (プッシュ) でメソッドを呼び出すだけなので、「配列」は元の配列を参照して更新します。

于 2013-01-27T19:24:35.323 に答える