値をレコードでまとめる

まとめて代入

 リストで扱うよりも、レコードで扱った方が分かりやすい場合もあります。リストで扱う方法を理解している前提で解説しますので、とりあえず「値をリストでまとめる」を参照して下さい。
 まず、レコードに値を一気に代入する方法を考えます。
 以下のスクリプトは単にx,y,zという変数に値を代入する結果となり、theCoodinatesに変化はありません。

set theCoordinates to {x:1, y:2, z:3}
tell theCoordinates to set {x, y, z} to {4, 1,-1}

theCoordinates
--> {x:1, y:2, z:3}

 ただし、以下のように既に定義されている属性の名称(所謂、予約語)を使うと、代入可能になります。これは標準だけでは無く、OSAXで定義されている場合でも同様で、tellブロックで指定しているアプリケーションでもそうです。
「動くようになっている」というより「動いてしまう」機能と思われるので、使わないようにした方が無難でしょう。

set x to {length:1, time:2, day:3}
tell x to set {length, time, day} to {4, 1, -1}

x
--> {length:4, time:1, day:-1}

 一応、以下のように、各属性にof 変数として指定すれば、一度に代入できますが、これくらい長くなると、無理にまとめる必要も無いように思えます。

set theCoordinates to {x:1, y:2, z:3}
set {x of theCoordinates, y of theCoordinates, z of theCoordinates} to {4, 1,-1}

theCoordinates
--> {x:4, y:1, z:-1}

 変数名が長いだけという話もありますが、この程度の変数名は付けておいた方がスクリプトは分かりやすくなります。もし「スクリプト編集プログラム」の制限を超えてしまうような場合は、ScriptDebugger等のもう少ししっかりした開発環境の購入か、アルゴリズムの見直しを考える方がいいでしょう。
 一応解説しておくと、tellとitを利用する事で微妙に短くする事もできます。

set theCoordinates to {x:1, y:2, z:3}
tell theCoordinates to set {x of it, y of it, z of it} to {4, 1, -1}

theCoordinates
--> {x:4, y:1, z:-1}

属性をレコードに

 オブジェクトや値に含まれる属性を取り出して、以下のようにレコードにする事もできます。

{y:year, d:day, t:time} of (current date)

 この時、レコードのラベルは既に使われているもの(予約語)と共用できます。つまり上記のスクリプトは以下のように書いても良いという事です。

{year:year, day:day, time:time} of (current date)

 予約語とダブる使い方はあまり感心できるものでは無いようにも思えますが、このような使い方ならば、それほど混乱も無く逆に分かりやすいスクリプトが書けていいんじゃないかと思います。

まとめて取り出す

 代入先にレコードの各属性がある場合は、まとめて代入する事はできませんでしたが、逆に代入の元になる方であれば、以下のように書く事で、まとめて代入する事ができます。

set theCoordinates to {x:1, y:2, z:3}
set {x1, y1, z1} to {x, y, z} of theCoordinates -- tell theCoordinates to set {x1, y1, z1} to {x, y, z}では、動かない

{x1, y1, z1}
--> {1, 2, 3}

 このように、レコードの場合は、リストほど使い勝手のいいものではありませんが、訳に立つ場面がないわけではありません。
 一応知っておけば、スクリプトを読む場合に吃驚しなくて済む程度の効用はあるでしょう。


2000-07-01 -2000-07-02 -2002-01-08