プロパティ
オブジェクトのプロパティの参照
リストおよびプロティリストにおいてプロパティリストについて説明したように、オブジェクトのプロパティには複数の方法でアクセスできます。これには、ドット(.)やアポストロフィー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がオブジェクトでない場合)は、「color」関数メッセージはパラメータとしてgumdropオブジェクトとともに送られます。このメッセージは、me、つまりそのスクリプトが実行しているオブジェクトにも送られます。 |
この一連のアクションにより、gumdropオブジェクトの設計者は、function color ハンドラ、getProp colorハンドラ、または実際のcolorプロパティを使用して、オブジェクトカラーの導入を選択できます。 |
単語のpropertyを使用する場合は、オブジェクトプロパティには関数を呼び出すことなくアクセスできます(ただし、getPropまたはsetPropが必要に応じて引き続き呼び出されます)。 put property color of gumdrop -- color関数の呼び出しを避けます |
パラメータも渡されますが、これを実行する構文は関数呼び出しかプロパティアクセスによって異なります。 put gumdrop.color("sprinkles") -- color関数を呼び出します put gumdrop's color("sprinkles") -- color関数を呼び出します put the color of gumdrop with "sprinkles" -- 統合されたアクセス put property color of gumdrop with "sprinkles" -- プロパティ |
ここでは、最初の2つの例では、パラメータ(単語「sprinkles」)はcolor関数にパラメータとして渡されます。単語「with」を伴わない丸括弧の使用は、常に関数呼び出しを表します。(「of」構文を利用する)3つ目の例では、上述した統合プロセスが呼び出され、パラメータがcolor関数とgetPropハンドラ(呼び出された場合)にも渡されます。「color」関数メッセージをmeに送る最後の手順がそのプロセスの一部として呼び出される場合は、gumdropオブジェクトと単語「sprinkles」の両方がパラメータとして渡されます。 |
複数パラメータも(常に丸括弧内で)渡すことができます。 put gumdrop.color("red", "pink") -- 関数呼び出し put gumdrop's color("red", "pink") -- 関数呼び出し put the color of gumdrop with ("red", "pink") -- 統合 put property color of gumdrop with ("red", "pink") -- プロパティアクセス |
スペシャルプロパティ
SenseTalkに特別な意味を与える複数のオブジェクトプロパティが存在します。これらのプロパティの一部は、キーまたは値の関数で表記されないという意味で「隠されて」おり、オブジェクトのデフォルトのテキスト表現においても表示されませんが、オブジェクトのプロパティとして直接アクセスが可能です。
ObjectType
オブジェクトのobjectTypeプロパティを設定すると、is a演算子向けの特定タイプのオブジェクトであるとみなされます。例えば、例外が投げられる際にcatchキーワードによってキャッチされたオブジェクトは、objectTypeプロパティを「例外」に設定させます。そのため、本オブジェクトが「error」と命名された変数に含まれる場合は、error is an “exception”という表現はtrueであると評価されます。オブジェクトのタイプが2つ以上存在すると考えられる場合は、objectTypeプロパティを各タイプのリストに設定する場合があります。本例を参照。
set shape to (width:7, height:7, objectType:("rectangle",
"square"))
put shape is a "rectangle" -- true
put shape is a "square" -- true
実際は、is a演算子によって検証される値がオブジェクトの場合は、SenseTalkはそのオブジェクトに、パラメータとしてのタイプとともに「isObjectType」関数メッセージを送ります。オブジェクトに関数isObjectTypeのハンドラが含まれる場合は、オブジェクトが所定のタイプかどうかを動的に判断し、状況に応じてtrueまたはfalseを返すことができます。SenseTalkにデフォルトで実装されるこの関数により、上述したように、オブジェクトの「objectType」プロパティがチェックされます。
AsText
このasTextプロパティがオブジェクトに対して設定される場合は、「asText」関数メッセージを処理する場合を除き、これはオブジェクトのテキスト表現として使用されます。
set shape to (objectType:"Square", size:7, asText"Seven Square")
put shape -- 「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"
add 5050.50 to account's balance
put account -- "Savings Account: 6284.75"
オブジェクトにasText関数ハンドラも、asTextプロパティ、asTextFormatプロパティも存在しない場合は、plistPrefixなどを用いるデフォルト表現が使用されます(リストおよびプロパティリスト)。
スクリプト
オブジェクトのスクリプトはそのオブジェクトのプロパティであり、変更が可能です。スクリプトを設定すると、新しいスクリプト内において、オブジェクトの挙動がハンドラの挙動に変化します。既に実行中のハンドラは、次に呼び出されるまで変化しません。
set Fido to (script:<<play "Basso">>)
set the script of Fido to guardDogScript
Helpers、Early Helpers
このhelpersプロパティとearlyHelpersプロパティは、オブジェクトのリストを保持する隠されたプロパティです。新しいヘルパーオブジェクトの挿入などによってこれらのプロパティのうち1つが変化すると、リスト内の各アイテムがオブジェクトであることを確かめるためにチェックされ、そうでない場合は例外が投げられます。このリスト内のアイテムは、常にオブジェクトのlong idとして報告されます。
Name、Long Name、Short Name、Abbreviated Name、Long ID
このnameプロパティは、形容詞のlong、shortまたはabbreviatedが前に付けられるその変種のプロパティ、およびlong idプロパティと共に、すべてオブジェクトを特定する隠されたプロパティです。nameプロパティ以外のすべてのプロパティは読み取り専用です。スクリプトファイルのオブジェクトの場合は、long nameとlong idはともにディスク上のファイルのフルパス名、nameとabbreviated nameは拡張子を含むファイル名、short nameは拡張子がアプリケーション内で認識済みのスクリプトの拡張子である場合は拡張子を伴わないファイル名を表します。
Folder、Directory
スクリプトファイルオブジェクトには、スクリプトファイルが存在するフォルダのフルパスを提供するフォルダ(またはディレクトリ)の隠された読み取り専用プロパティも含まれます。