プロパティ
SenseTalkオブジェクトのプロパティのほとんどは、任意のタイプの値を保存できる普通のコンテナであり、スクリプト内で使用される方法以外には特別な固有の意味を持ちません。ただし、いくつかの特別なプロパティは、オブジェクトがSenseTalkによってどのように扱われるかに影響を与えます。これには、普通のプロパティとして表示されるが特別な意味を持つasText
、asTextFormat
、objectType
、そしてscript
プロパティが含まれます。また、keys
関数によってリストされないが、スクリプトによってアクセスし、場合によっては変更することができるhidden
オブジェクトプロパティが多数あります。これにはlong id
、name
、そしてhelpers
プロパティが含まれます。
オブジェクトのプロパティへの参照
オブジェクトのプロパティは、ListsとProperty Listsで説明されているように、いくつかの方法でアクセスできま す。これにはドット(.
)、アポストロフィ-S(‘s
)、そしてof
の構文が含まれます。普通のプロパティはコンテナとして扱われます – あなたはそれらに任意のタイプの値を保存したり、変数や他のコンテナの中の値と同様にそれらの値を変更したりすることができます。
プロパティと関数の統合: アドバンスド
オブジェクトのプロパティにアクセスすることと、オブジェクトに関数を呼び出すことは、全く異なるタスクであるように思えるかもしれませんが、多くの点でそれらは非常に似ています。SenseTalkは、プロパティの値を動的に計算する関数を使用して"プロパティ"値を定義することをオブジェクトに許可します。オブジェクトの設計者がそれがどのように実装されるかについて完全な柔軟性を持たせるために、オブジェクトに関数を呼び出すこととプパティにアクセスすることは、アクセスを行っているスクリプト内で同じように見えます。これがどのように機能するかを見るために、以下の3つの例を考慮してください(これらはすべて同等です):
put gumdrop.color
put gumdrop's color
put the color of gumdrop
これらの例のいずれかは、まず、gumdrop
がオブジェクトであれば、'color'関数メッセージが直接gumdropオブジェクトに送られる(注:このメッセージは通常のメッセージパスを通じてではなく、オブジェクトとそのヘルパーにのみ送られます)。gumdropオブジェクトがfunction color
ハンドラーを持っていれば、そのハンドラーが呼び出され、それが返す値が式の値となります。もしcolorメッセージをハンドルしない場合、代わりにgumdropのcolor
プロパティがアクセスされます(以下で説明するgetPropやsetPropを呼び出すことを含む)。最後に、もしcolor
プロパティがない(またはgumdropがオブジェクトではなかった)場合、gumdropオブジェクトをパラメータとして'color'関数メッセージが送られます。このメッセージはme
、つまりスクリプトを実行しているオブジェクトに送られます。
この一連のアクションのため、gumdrop
オブジェクトの設計者は、オブジェクトの色をfunction color
ハンドラー、getProp color
ハンドラー、または実際のcolor
プロパティを使用して実装することを選択することができます。
property
という言葉が使われると、関数を呼び出すことなくオブジェクトのプロパティにアクセスされます(しかし、適切な場合にはgetPropやsetPropがまだ呼び出されます):
put property color of gumdrop -- avoid calling the color function
パラメータも渡すことができますが、そのための構文は関数呼び出しとプロパティアクセスで異なります:
put gumdrop.color("sprinkles") -- 関数を呼び出す
put gumdrop's color("sprinkles")
put the color of gumdrop with "sprinkles"-- 統一アクセス
put property color of gumdrop with "sprinkles"-- プロパティ
ここでは、パラメータ(単語「sprinkles」)は、最初の2つの例でcolor関数にパラメータとして渡されます。「with」の単語なしで括弧を使うと常に関数呼び出しを意味します。3番目の例(「of」構文を使用)は、パラメータをcolor関数に渡し、また、それが呼び出される場合はgetPropハンドラーにも渡すという統一プロセスを呼び出します。そのプロセスの一部としてme
への「color」関数メッセージの最終ステップが呼び出される場合、gumdropオブジェクトと単語「sprinkles」の両方がパラメ ータとして渡されます。
複数のパラメータも渡すことができます(常に括弧内):
put gumdrop.color("red", "pink") -- function call
put gumdrop's color("red", "pink")
put the color of gumdrop with ("red", "pink") -- unified
put property color of gumdrop with ("red", "pink") -- property access
特殊なプロパティ
SenseTalkには特別な意味を持ついくつかのオブジェクトプロパティがあります。これらのプロパティの一部は、keysやvalues関数でリストされず、オブジェクトのデフォルトのテキスト表現には表示されませんが、オブジェクトのプロパティとして直接アクセスすることができます。
ObjectType
オブジェクトのobjectType
プロパティを設定すると、それはis a
演算子の特定のタイプのオブジェクトとして識別されます。例えば、例外がスローされたときにcatch
キーワードで捕まえられるオブジェクトは、そのobjectTypeプロパティが「exception」に設定されているので、このオブジェクトが「error」という名前の変数にあるなら、式error is an “exception”
はtrueと評価されます。objectTypeプロパティは、オブジェクトが複数のタイプとみなされる場合には、タイプのリストに設定することもできます。以下に示すように:
set shapeto (width:7, height:7, objectType:("rectangle","square"))
put shape is a "rectangle" -- true
put shape is a "square" -- true
実際には、is a
演算子がテストする値がオブジェクトである場合、SenseTalkは「isObjectType」関数メッセージをオブジェクトに送り、タイプをパラメータとして渡します。オブジェクトがfunction isObjectType
ハンドラーを持っている場合、それは動的にそのオブジェクトが与えられたタイプのオブジェクトであるかどうかを判断し、それに応じてtrueまたはfalseを返すことができます。この関数のデフォルトのSenseTalk実装は、上記のようにオブジェクトの「objectType」プロパティをチェックします。
AsText
オブジェクトにasText
プロパティが設定されている場合、それは「asText」関数メッセージを処理しないオブジェクトのテキスト表現として使用されます:
set shape to {objectType:"Square", size:7, asText:"Seven Square"}
put shape -- displays "Seven Square"
AsTextFormat
オブジェクトが「asText」関数ハンドラーもasText
プロパティも持っていない場合、SenseTalkはasTextFormat
プロパティをチェックします。このプロパティがオブジェクトに設定されている場合、その値はmerge()
関数を使用してオブジェクトのテキスト表現を生成するためのフォーマット文字列として使用されます(テキストとデータ操作を参照)。これはオブジェクトの動的なテキスト表現を簡単に実現する方法を提供します:
set account to {balance:1234.5, type:"Savings",asTextFormat: "[[my type]] Account: [[my balance]]"}
put account -- "Savings Account: 1234.25"
アカウントの残高に5050.50を加える
put account -- "普通預金: 6284.75"
オブジェクトがasText関数ハンドラもasTextプロパティもasTextFormatプロパティも持っていない場合、デフォルトの表現は plistPrefix
等を使用します( [リスト](/studio/ja/23.3/stk-lists)と[プロパティリスト](/studio/ja/23.3/stk-property-lists)を参照): ### スクリプト
スクリプト
オブジェクトの script
はそのオブジェ クトのプロパティで、変更することができます。スクリプトを設定すると、オブジェクトの振る舞いが新しいスクリプト内のハンドラのそれに変わります。既に実行中のハンドラは、次に呼び出されるまで変わりません。
set Fido to {script:<<play "Basso">>}
set the script of Fido to guardDogScript
ヘルパー、早期ヘルパー
helpers
および earlyHelpers
プロパティは、オブジェクトのリストを保持する隠しプロパティです。これらのプロパティのいずれかが変更されると、新しいヘルパーオブジェクトを挿入するなどして、リスト内の各アイテムがオブジェクトであることが確認され、オブジェクトでない場合は例外がスローされます。このリスト内のアイテムは常に、オブジェクトのロングIDとして報告されます。
名前、長い名前、短い名前、略名、長いID
name
プロパティ、それに先行する形容詞 long
、short
、abbreviated
のバリエーション、そして long id
プロパティは、すべてオブジェクトを識別する隠しプロパティです。これらのプロパティのうち name
プロパティだけが読み取り専用ではありません。スクリプトファイルオブジェクトの場合、長い名前と長いIDはディスク上のファイルのフルパス名で、名前と略名は拡張子を含むファイルの名前で、短い名前は、拡張子がアプリケーションで認識されるスクリプトの拡張子である場合、拡張子なしのファイルの名前です。
フォルダ、ディレクトリ
スクリプトファイルオブジェクトには、スクリプトファイルが位置しているフォルダのフルパスを提供する folder
(または directory
)という読み取り専用の隠しプロパティもあります。