2012-06-18T19:57:22+09:00

AppleScript のスクリプトオブジェクトの継承と my による property の参照

AppleScript のスクリプトオブジェクトの property のスコープについて、少々講釈をたれるぜ。そして、スクリプトオブジェクトを継承した場合の property へのアクセスについての注意事項を少々。

スクリプトオブジェクトを使いこなして AppleScript でオブジェクト指向している人の生息さえ不確かなんだけど、いつの日か誰かのお役に立つことを願って。

まずは、次のスクリプトを見てください。トップレベルで property msg を宣言しています。そして、スクリプトオブジェクト ProperyAccess の中から、トップレベルの property msg を参照している。

property msg : "top"

script PropertyAccess
on do()
return msg
end do
end script

PropertyAccess's do()
--> "top"

スクリプトオブジェクトは、parent property を指定しないと、そのスクリプトオブジェクトを内包しているスクリプトオブジェクトを自動的に継承する。つまり、PropertyAccess の parent はトップレベルスクリプトになる。

さて、スクリプトオブジェクト PropertyAccess からプロパティ msg にアクセスできる理由は、

  1. 変数 msg のスコープにあるから。
  2. 継承したオブジェクトのプロパティだから。

のどちらだろう?答えは、1番「変数 msg のスコープにあるから」。その証拠に、次のように PropertyAccess の parent を指定して、トップレベルを継承しないようにしてみる。これでも、トップレベルのプロパティ msg にはアクセスできちゃうぜ。

property msg : "top"

script PropertyAccess
property parent : AppleScript
on do()
return msg
end do
end script

PropertyAccess's do()
--> "top"

実は、スクリプトオブジェクトの property にアクセスする為には、その所属先を明示しなければならない。ハンドラの中から所属しているスクリプトオブジェクトにアクセスする為には、my や me といった用語を使う必要がある。

property msg : "top"

script PropertyAccess
on do()
return my msg
end do
end script

PropertyAccess's do()
--> "top"

ちなみに、トップレベルを継承していない ProperyAccess の中で、my をつけて変数 msg にアクセスすると、エラーになる。PropertyAccess には msg というプロパティが存在しないからだ。

property msg : "top"

script PropertyAccess
property parent : AppleScript
on do()
return my msg
end do
end script

PropertyAccess's do()
--> error "Can’t make msg into type reference."

ほとんどの場合は、my があっても無くても関係ないと思う。スクリプトオブジェクトを継承した場合は my が無いと期待したプロパティを参照しなくなる。

property msg : "top"

on do_with_my()
return my msg
end do_with_my

on do_without_my()
return msg
end do_without_my

script PropertyAccess
property msg : "sub"
end script

PropertyAccess's do_with_my()
--> "sub"

PropertyAccess's do_without_my()
--> "top"

上のスクリプトでは、トップレベルでハンドラを定義している。そして、トップレベルを継承したスクリプトオブジェクトを経由してハンドラを実行している。オブジェクト指向的には、メッセージを送った先のオブジェクトのプロパティが参照されないといけないんだけど、my をつけないとスコープにある変数を参照してしまう。だから・・・・

property にアクセスしたいときは、my を必ずつけるようにした方がいい。

こんな知識が何の役に立つかというと、AppleScript でオブジェクト指向をバリバリ活用する為には必要になる。たとえば、AppleScript でクラスを表現する時には必須になる。

AppleScript のスクリプトオブジェクトでクラスを作ろう

という解説を、昔書いたのでご参照ください。