カウンタの参照渡し

参照を利用する

 リストの全ての項目に同じ操作を加えたい場面は、ちょくちょく出てきます。
 普通に考えれば、例えば「全ての項目に+1する」という場合、次のようなスクリプトになると思います。

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

repeat with i from 1 to number of theList
	set item i of theList to (item i of theList) + 1
end repeat

theList

 これでも構わないのですが、curitemに入っているのは値そのものでは無くて参照なので、その事を利用すると少し簡単に書けます。
 速度も高速なのも有り難いところです。

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

repeat with curItem in theList
	set contents of curItem to curItem + 1
end repeat

theList

 上のスクリプトは内部的に、下のようなスクリプトになっていると考えられます。

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

repeat with i from 1 to number of theList
	set curItem to (a reference to (item i of theList))
	set contents of curItem to curItem + 1
end repeat

theList

 つまり、リストの項目数を数えたり参照を代入したりといった処理をAppleScript側でやってくれているわけです。

ハンドラで利用する

 ハンドラに渡す場合そもそもリストは参照渡しなので(詳しくは「引数の参照渡し」を参照して下さい)、ハンドラで処理する場合にどうなるかを考えてみます。
 素直にスクリプトを書くと次のようになります。

set theList to {1, 2, 3, 4, 5, 6}
addOne(theList)
theList

on addOne(tmpList)
	repeat with curItem in tmpList
		set contents of curItem to curItem + 1
	end repeat
end addOne

 見事に期待通りの働きをし、theListの各項目は+1されます。
 何気ないTipですが、強力です。知っておいて損は無いでしょう。


2000-07-02