2016-09-12T17:37:17+09:00

run ハンドラ内の変数はトップレベルだけで特別扱いされている?

スクリプトエディタで、ハンドラを定義することなくスクリプトを書き始めれば、そこはトップレベルの暗黙の run ハンドラ として、実行されます。そして、run ハンドラ内の変数は、property として保存されます。

それを確認するために、次のスクリプトを実行してみてください。

try
display alert "x's value is " & quoted form of x
on error
set x to "hello"
display alert "first launch"
end try

最初の実行では、

2回目以降の実行では、x の値が定義されているので、

と表示されるはずです。つまり、run ハンドラ内での変数 x への代入によって property x が生成されていることになります。

property が生成されているなら、ユーザー定義ハンドラからアクセスできるはずですね。そのことを、次のスクリプトで確認できます。ただし、property 宣言がないので、my が無いと参照できません。

set x to "hello"

on get_x()
return my x
end get_x

on get_x_without_my()
return msg
end get_x_without_my

log get_x() -- (*hello*)
try
log get_x_without_my() -- error
on error errmsg
log errmsg -- (*msg変数は定義されていません。*)
end try

さて、このような性質は、トップレベル以外の任意の run ハンドラでもあるのか?ということが気になります。結論から言うと、トップレベルでないスクリプトオブジェクトの run ハンドラ内の変数は通常のローカル変数になります。それを確認するために、次のように、上と同じことをネストして定義したスクリプトオブジェクトに対して行ってみます。

script A
set x to "hello"

on get_x()
return my x
end get_x
end script

run A
try
log A's get_x() -- error
on error errmsg
log errmsg -- (*x のタイプを reference に変換できません。*)
end try

トップレベルでないスクリプトオブジェクトの run ハンドラで変数を設定しても、その変数をハンドラの中からアクセスできませんでした。つまり、property を生成することは無いようです。

run ハンドラ内の変数について、エレガントな統一的な知見が欲しかったけど、そのような期待は打ち砕かれ、「トップレベルの run ハンドラの変数だけが特別」ということのようです。