0

1 つの配列からエントリをスプライスすると、別のアレイから同じエントリがスプライスされます... 何が起こっていますか?

        private static var words:Array = new WordFile().toString().split(/\n/);
        private static var wordsTemp:Array;

public static function checkWord (word:String):Boolean
    {
var truefalse:Boolean = wordsTemp.indexOf(word+"\r".toLowerCase()) > -1;
                trace (words.length)

                wordsTemp.splice(wordsTemp.indexOf(word+"\r".toLowerCase()), 1);

                trace (words.length)
   return truefalse

}
public static function resetArrays :void
{
wordsTemp = words
}

このコードでは、新しいゲームが開始されるたびに resetArrays 関数を呼び出します。ゲームに入ると、プログラムは単語を渡して checkWord を呼び出します。ワード配列で見つかった場合は、一時配列からスプライスします。ただし、実行すると、2 つのトレースで 2 つの異なる数値が生成され、2 番目の数値は 1 つ低くなります (単語が配列で見つかったと仮定します)。リセットされる一時的な配列をつなぎ合わせているので、これは非常に奇妙に思えますが、変更されていないはずの配列をトレースすると(私が示している以外の操作はありません)一時配列のスプライスによって変更される...

何かご意見は?

4

3 に答える 3

1

StringAS3 では、 and Number(および関連)を除くすべてのデータ型が参照によってコピーされます。

これは、使用時に元のオブジェクトへの参照のみをコピーすることを意味しますmyArray1 = myArray2

より詳細には、wordsが格納されているメモリを検討してください。0x123456

wordsTemp = words同じメモリ、つまり 0x123456をwordsTemp指します

で何らかの操作を行うとwords、0x123456 の配列が変更されます。しかし、これはwordsTemp指しているものです。したがって、実際には両方とも同じオブジェクトです。両方を異なるものにするには、オブジェクトを複製する必要があります。配列の場合、配列を変更して新しい配列を返す任意のメソッドを使用してクローンを作成できます。Array.slice

wordsTemp=words.slice(0, words.length); //will do the trick

または、元の配列に何も連結せずに複製を取得することもできます

wordsTemp=words.concat();

あるいは、さらに多くのコード行を書きたい場合は、次のようにすることができます。

wordsTemp=new Array();
for (var i:int=0; i<words.length; i++) {
    wordsTemp.push(words[i]);
}
于 2012-06-05T04:07:25.237 に答える
0

wordsTemp = wordsを実行する場合、配列項目を割り当てるだけでなく、プログラムのメモリスペースを割り当てます。すべてのアイテムを最初の配列から2番目の配列にコピーする必要がありますが、同じように設定しないでください。

ループを実行して、すべてのアイテムを単語からwordsTempにコピーするか、次のようにすることができます。

wordsTemp = words.slice(0, words.length);

変更せずに元の配列のコピーを返しますホップ

于 2012-06-05T02:36:18.217 に答える
0

私の知る限り、AS3 で配列を複製する最も簡単で「標準的な」方法は次のとおりです。

var cloneArray:Array = sourceArray.concat();
于 2012-06-05T04:54:05.560 に答える