プロパティ
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)を参照): ### スクリプト