コンテナへの参照
ほとんどの場合、スクリプト内のコンテナは、スクリプト内で直接変数名(または他のコンテナ識別子)を指定することで、コンテナに直接値を格納したり、コンテナから値を読み出したりすることで使用されます。しかし、時々、コンテナへの参照を格納することが非常に有用になることがあります。これを使って、後でそのコンテナの値にアクセスすることができます。参照はコンテナの値ではなく、コンテナのアイデンティティを保持しており、参照にアクセスすると、それが参照しているコンテナの内容を読み出したり書き込んだりします。
参照の特性
参照には、それらを使って作業を行う際に認識しておきたいいくつかの特性があります。参照がどのように動作するかを理解するための第一歩として、次の単純な変数への参照を使用した例を考えてみてください:
put 32 into age -- Ageは現在、値32を含む変数です
put a reference to age into yearsOnThePlanet -- 参照を格納する
put yearsOnThePlanet -- 32 (yearsOnThePlanetはageの値を参照します)
add 1 to age -- Ageは現在33です
put yearsOnThePlanet -- 33を出力する (参照は動的です)
上記の最初の行では、単純な値(32
)が普通の変数(age
)に割り当てられます。次の行では、変数age
への参照を変数yearsOnThePlanet
に格納します。これにより、yearsOnThePlanet
変数の値への任意のアクセスは、実際にはスクリプトの次の行で示されているように、age
変数の値にアクセスすることになります。スクリプトの最後の2行では、age
変数の値を増やし、yearsOnThePlanet
変数が更新された値にアクセスすることを示しています。
参照は強く結びつく
参照によって確立される接続は"スティッキー"(上記の例ではyearsOnThePlanet
はage
にしっかりと接着されています)なので、割り当ては他の方向でも動作します - どちらの値を変更しても、両方の値が変わります:
put 29 into yearsOnThePlanet
put age -- 29を出力します
参照構文
参照は、container
、reference
、reference to
、refer to
の単語を使用するか、または@
記号をコンテナの前に置くことで作成できます。以下のすべてが等価です:
put container thing into watcher
set watcher to be a reference to thing
put @thing into watcher
set watcher to reference thing
set watcher to refer to thing
構文:
container aContainer
{a} reference {to} aContainer
refer to aContainer
@ aContainer
参照はリストまたはプロパティリストに格納できます
参照は、これまでの例で示したように変数に格納するだけでなく、リストのアイテムとして、またはオブジェクトまたはプロパティリストのプロパティとして格納することもできます。この場合、参照である特定のアイテムまたはプロパティにアクセスすると、それが参照しているコンテナにアクセスします。次の例で示しています:
put 13 into luckyNumber
put ["horseshoe", container luckyNumber, "penny"] into charms
put charms -- [horseshoe, 13, penny]
put 7 into item 2 of charms
put charms -- [horseshoe, 7, penny]
put luckyNumber -- 7
参照はプロパティ、ファイル、チャンクを指すことができます
参照は、変数だけでなく、任意の種類のコンテナを参照することができます。これには、このセクションの前半部分で説明したすべての異なる種類のコンテナが含まれ、プロパティ、ファイル、さらには任意のコンテナのチャンクを含みます:
set highScore to reference item 2 of line 3 of file "/tmp/stats"
put @ item 2 delimited by "." of the numberFormat into decimalFormat
参照は動的です
オブジェクトのプロパティやコンテナのチャンク(reference to word 3 of sentence
のような)への参照が作成されると、その参照は使用されるたびに動的に評価されます。これは、sentence
の内容が変更された場合でも、参照は常に新しい内容の3番目の単語にアクセスすることを意味します。
参照は"感染性"がありません
SenseTalkの代入は、明示的に参照が示されていない限り、常に値によって行われます。したがって、参照を含む変数を別の変数に代入すると、別の参照は作成されず、ソースコンテナの現在の値のコピーだけが作成されます。別の参照を作成するには、代入時に明確に参照を指定する必要があります(参照への参照を指 定すると、同じソースへの2つ目の参照が作成されます)。
put 123 into source
put a reference to source into ref -- 123 (ref is a reference)
put ref into number -- 123 (number is NOT a reference)
put @ref into ref2 -- 123 (ref2 is now another reference to source)
put 456 into source
put ref -- 456
put number -- 123
put ref2 -- 456
参照は再割り当て可能です
すでに参照を含む変数に参照を格納すると、その変数は新しい参照に単純に再割り当てされます。以前参照していた変数の値は変わりません:
put [123, 456] into [source1, source2]
put a reference to source1 into ref
put ref -- 123
put a reference to source2 into ref -- Ref is now reassigned
put 789 into ref -- Source1 is unaffected
put [source1, source2] -- [123, 789]
元の参照変数を再割り当てするのではなく、参照していたコンテナを参照に変更するには、container referred to
を使用して明示的に要求することができます:
put @source1 into the container referred to by ref -- Ref still refers to source2, which now becomes a reference to source1
put "We're Twins" into ref -- Assign to ultimate container
put [source1, source2] -- [We're Twins,We're Twins]