2012年12月11日火曜日

AppleScript:暗黙のgetとreference

AppleScriptで、ちゃんと勉強しないとつまづくところがわかってきた。

ひとつは「暗黙のget」

もう一つは「reference」

「暗黙のget」は、
本来、AppleScriptはobjectを指定した場合、直接指定できてないとき( home とか)は、getして対象アプリ(tellしているアプリ)に解決させて直接値を取らないといけない。ところが大抵の場合AppleScriptが気を利かせて「暗黙のget」をしてくれてしまう。これが完璧ならいいのだけど、なぜだか時々「暗黙のgetが出来ると思い込む」時があって、getしようとしてアプリから「それをgetする方法を知らない」と言われてしまう。この場合、大抵「何とか of 何とか of 何とか…」という形で、途中のオブジェクトの指定を解決してやればエラーが取れる。なので「何とか of (get 何とか of 何とか…)」と途中に明示的にgetを入れてやることでエラーが取れる。

「reference」は、
Cのポインターのようなもの。これも通常、AppleScriptがうまくde-reference してくれるのでreference と直接のobjectと区別がつかない。が、 is (=)と is not (≠)だけはこの自動de-referenceがされず、reference値を直接オペランドに使ってしまう。これではまる典型はrepeat文でrepeat文は

repeat with i in list

のiはlistの各itemへのreferenceになっている。ここで

if i is something then

とやると、永遠にtrueにならない。ここは

if (contents of i) is something then

と、referenceのcontents propertyを取り出してreferenceしているobjectを明示的にとりにいかないとだめ(自動的にde-referenceされない)。

これと、ごく当たり前ながら「何かのobjectをいじる時は必ず、そのobjectをかかえているapplicationに対してtellしないとだめ」。handlerの中も別scopeなので、明示的にtell application "..." ~ end tellとか ... of application "..." を書かないとだめ。という3つ辺りが、AppleScriptをやろうとして、language referenceを見たり、ネットの入門解説サイトをちょっとみただけではエラーが取れないポイントだという気がしてきた。

0 件のコメント:

コメントを投稿