メモ(配列の切り出し、代入、コピー)

投稿者:            mini mosmoss 投稿日:2016/05/16 18:06

配列の切り出し、代入、コピーについて
勘違いしていたことがあった

元になる配列から、
sliceArray()を使って切り出したり、
=などを使って別の配列に代入した要素が、
連動して変化する!というのが直感的にわからなかった

切り出し、代入した時点での状態から、
別々の配列になって要素は独自に変化すると、何となく思ってた

aoihikawaさんの配列の実体コピーを行う関数は、
多次元配列を一気にコピーできるから便利!くらいに思っていたけど、
本質は別のところにあったみたい(・ω・)
この、配列の実体コピーってやつが、
最初思ってた配列の切り出しや代入のイメージに、
ぴったりのやつの方だった


#配列の実体コピーを行う関数

def isArray(arr)
  return getArrayLength(splitString(toString(arr),",")) != 1
end
def copyArray(arr)
  r = createArray()
  i = 0; ilen = getArrayLength(arr)
  while i < ilen
    if isArray(arr[i])
      r[i] = copyArray(arr[i])
    else
      r[i] = arr[i]
    end
    i = i + 1
  end
  return r
end

#元の配列

a = createArray()

a[0] = createArray()
a[0][0] = 0; a[0][1] = 10; a[0][2] = 100


#配列切り出し
A = sliceArray(a, 0, 1)

#配列代入
B = createArray()
B[0] = a[0]

#配列の実体コピー
C = copyArray(a)


plus = true
while plus

a[0][0] = a[0][0] + 1
speak(a[0][0]," ",A[0][0]," ",B[0][0]," ",C[0][0])
#実行結果、1 1 1 0
#a[0][0]に1が足されるのに連動して、A[0][0]とB[0][0]も同時に1ずつ増えて行くがC[0][0]は変化なし

A[0][0] = A[0][0] + 1
speak(a[0][0]," ",A[0][0]," ",B[0][0]," ",C[0][0])
#実行結果、2 2 2 0
#A[0][0]に1が足されるのに連動して、a[0][0]とB[0][0]も同時に1ずつ増えて行くがC[0][0]は変化なし

B[0][0] = B[0][0] + 1
speak(a[0][0]," ",A[0][0]," ",B[0][0]," ",C[0][0])
#実行結果、3 3 3 0
#B[0][0]に1が足されるのに連動して、a[0][0]とA[0][0]も同時に1ずつ増えて行くがC[0][0]は変化なし

C[0][0] = C[0][0] + 1
speak(a[0][0]," ",A[0][0]," ",B[0][0]," ",C[0][0])
#実行結果、3 3 3 1
#C[0][0]は1増えるが他は変化なし

C = copyArray(a)
speak(a[0][0]," ",A[0][0]," ",B[0][0]," ",C[0][0])
#実行結果、3 3 3 3
#配列コピーがされる時点での配列aの状態が配列Cに更新される

end

コメントする

コメントするには、ログインする必要があります。

コメント一覧

コメントはありません。