repeat with〜in〜の性質

ループ内で値を替える

 基本的に、ループ中に範囲となる変数を変えてもループに影響は無いのですが、リストの場合、ループの最初に記録されるのはリストの参照であって、データ本体では無いので、ループ中に内容の変化があると、カウンタの中身も変化します。

set theList to {1, 2, 3, 4, 5}

repeat with curItem in theList
	set item 3 of theList to  "SUN"
	display dialog curItem
end repeat

ループ内で追加する

 ただし、長さは最初に記録されるので、以下のようにリストの長さを変えても動作に変化はありません。
 カウンタとして取り出されはしませんが、項目自体は追加されています。

set theList to {1, 2, 3, 4, 5}

repeat with curItem in theList
	set end of theList to ("追加" & curItem)
	display dialog curItem
end repeat

theList
-->{1, 2, 3, 4, 5, "追加1", "追加2", "追加3", "追加4", "追加5"}

 次のように、項目をリストの頭に付けていくことで、仕組みがよりハッキリします。

set theList to {1, 2, 3, 4, 5}

repeat with curItem in theList
	set beginning of theList to ("追加" & curItem)
	display dialog curItem
end repeat

theList
-->{"追加1", "追加1", "追加1", "追加1", "追加1", 1, 2, 3, 4, 5}

theList全体を書き換える

 theList自体を書き換えたらどうなるかというと、リストには参照を使って値が共有される性質がある事からも分かる通り、最初に渡した値は保持され、theListの内容(リストの中身への参照)のみ書き換えられます。
 つまりループに影響はありません。

set theList to {1, 2, 3, 4, 5}

repeat with curItem in theList
	set theList to "文字列にしたら?"
	display dialog curItem
end repeat

theList
--> "文字列にしたら?"

というわけで

 repeat with〜in〜には、他にも色々と特徴がありますが、詳しくは「カウンタの参照渡し」と「リスト以外をループで分割」を参照して下さい。
 repeat全体の基本的な性質は「ループの基本」を参照して下さい。


2000-08-05