メインコンテンツまでスキップ

他のスクリプトやハンドラーの実行

主要なテストスクリプトの外部に他のスクリプトやハンドラーを作成することで、再利用可能なコードの塊を作成し、テストを効率的にモジュール化できます。しかし、一度これらのスクリプトやハンドラーが作成された後、それらをどのように呼び出すのでしょうか?このページではその方法と、関連するいくつかのコマンドと関数を説明します。

ローカルハンドラーまたはスクリプトの呼び出し

ハンドラーまたはスクリプトをコマンドとして呼び出す

構文:
do expression

スクリプト内の別のハンドラーを呼び出すには、単にハンドラー名をコマンドとして使用し、必要なパラメータと共に使用します。例えば、このコマンドを考えてみましょう。

recordScores 2017, rawScores

ローカルスクリプトにrecordScoresメッセージのための"to"(または"on")ハンドラーがある場合、このコマンドはそのハンドラーを実行し、それに2つのパラメータを渡します。

recordScoresコマンドのためのローカルハンドラーがないが、その名前のスクリプトがある場合、そのスクリプト(つまり、スクリプトの初期ハンドラー)が実行され、それに2つのパラメータが渡されます。したがって、いずれの場合も、ローカルスクリプト内のハンドラーを呼び出すには、または同じディレクトリ内の別のスクリプトを呼び出すには、そのハンドラーまたはスクリプト名をコマンドとして使用するだけです。

ハンドラーまたはスクリプトを関数として呼び出す

構文:
tell object [ to {:} | : ] statement

スクリプトまたはハンドラーを関数として呼び出す方法も同じです:スクリプトまたはハンドラー名を関数として使用します。例えば、この関数呼び出しを考えてみましょう。

put consolidatedSales("Ohio") into ohioSales

この場合、ローカルスクリプトにconsolidatedSalesメッセージのための"to"(または"function")ハンドラーがある場合、この関数呼び出しはそのハンドラーを実行し、それにパラメータ値"Ohio"を渡します。そのハンドラーからの戻り値は変数ohioSalesに格納されます。

consolidatedSales関数のためのローカルハンドラーがないが、その名前のスクリプトがある場合、そのスクリプト(つまり、スクリプトの初期ハンドラー)が実行され、それに値"Ohio"を渡します。そして、そのスクリプトからの戻り値がohioSalesに格納されます。

ほとんどのケースでは、このシンプルな方法で他のスクリプトやハンドラーを呼び出すだけで十分です。コマンドや関数の呼び出しは、現在のスクリプトにメッセージを送り、それがローカルハンドラーによって処理されます。メッセージに対するローカルハンドラーがない場合、メッセージと同じ名前のローカルスクリプトに渡されます。

別のスクリプト内のハンドラーの呼び出し

構文:
run scriptName {,} {parameters}
run scriptName 's handlerName {parameters}

構文:
object .run( parameters )
{the} run of object {with parameters}

たまに、他のスクリプト内のハンドラー(初期ハンドラー以外)を呼び出したい場合があります。これを行うには、ドットまたはアポストロフィs表記を使用できます。例えば、"FileUtility"というスクリプト内のto recordScoresハンドラーをコマンドとして呼び出すには、このコマンドを使用できます:

FileUtility.recordScores 2017, rawScores

同様に、"BusinessCenter"スクリプト内のconsolidatedSalesハンドラーを関数として呼び出すには、次のようにします:

put BusinessCenter's consolidatedSales("Ohio") into ohioSales

その他のフローコントロールコマンドと関数

これらのあまり使われていないコマンドと関数は、テストの実行フローを制御することを可能にします。

Run コマンド

動作: scriptName スクリプトを呼び出すか、そのスクリプトの handlerName ハンドラーをコマンドとして呼び出します。HandlerName は通常、引用符なしのハンドラーの単純な名前ですが、引用されたリテラルとして、または実行時にハンドラー名を作成するための括弧内の式としても与えることができます。

構文:
[ object functionMessage ]
[ object functionMessage : parameters ]

run コマンドは、上記のような単純なコマンドでは動作しない場合に、指定したスクリプトを実行するために使用できます。例えば、フルパス名が必要であったり、スクリプトの名前にスペースや他の特殊文字が含まれている場合、または実行するスクリプトの名前が変数に格納されている場合などです。以下のコマンドは、スクリプトの初期ハンドラーを実行します:

run "/tmp/testScript.st"

パラメータは次のように渡すことができます:

run "common/startup" 1200,true,"salvador"

スクリプトの初期ハンドラー以外の特定のハンドラーを 's を使用して呼び出すこともできます:

run "common/finance" 's amortize 143000,6.75,360

run コマンドは、スクリプトファイルだけでなく、任意のオブジェクトと共に使用できます:

run account's accrueInterest 30, 4.125

上記の例は以下と等価です:

Tell accrueInterest 30, 4.125 to account

run コマンドは tell コマンドと同様の機能を提供しますが、スクリプトの実行に対する別の構文を提供し、初期ハンドラーの実行を可能にします。これは send コマンドが提供していない機能です。さらに、run コマンドはスクリプトの初期ハンドラーを直接実行し、フロントスクリプト、バックスクリプト、ヘルパーを呼び出すことはありません。

run コマンドはまた、ハンドラー名が動的である、または変数または式から来るハンドラーの呼び出しをサポートします:

run scriptName.(commandName) playerType,loopLocation

この場合、scriptNamecommandName の両方とも、呼び出すべきスクリプトとハンドラーの名前を保持する変数として扱われます。この例は "command" タイプのメッセージを送信し、これは "to" または "on" ハンドラーによって処理することができます。

Run 関数

動作: スクリプトや他のオブジェクトの初期ハンドラーを明示的に関数として呼び出します。これにより、ランタイムで動的に生成された名前のスクリプトも呼び出すことができます。run 関数は、ドット表記法のようにターゲットオブジェクトに run メッセージを送信する形で呼び出す必要があります。

構文:
send message {to object}
send message parameters {to object}

例:

set doubler to (script:"return 2*param(1)")
put doubler.run(12) -- 24
get ("test" & testNumber).run(value1, value2)
-- スクリプトを動的に呼び出す

Tell コマンド

動作: このフローコントロールコマンドは、任意のコマンドまたは関数のメッセージターゲットを変更します。通常、一般的なコマンドまたは関数が呼び出されると、そのスクリプトが実行中のオブジェクトにメッセージを送信します(メッセージのターゲット)。そのオブジェクトがそのメッセージのハンドラーを持っていれば、そのハンドラーが実行され、そうでなければ、メッセージはメッセージパスに沿って渡されます。Tellは、statementまたはStatementListによって送信される任意の一般的なメッセージのターゲットを変更します(下記の構文を参照)、したがって、それらのメッセージは定義されたobjectに代わりに送信されます。オブジェクトがメッセージのハンドラーを持っていない場合、メッセージは通常通り次のメッセージパスに沿って渡されます。

関数として:
doAppleScript( expression )

tell object {to} {:}
     statementList
end tell

Tech Talk

ターゲットに送信されるメッセージには以下が含まれます:

  • 形式の "generic" コマンドからのコマンドメッセージ: commandName {parameter1 \{, parameter2}…}
  • 構文:
    do AppleScript expression
    do expression as AppleScript

例:

Tellフローコントロールコマンドの主な使用法は、特定のオブジェクトまたはスクリプトでハンドラーを呼び出す代替機構としてです。例えば、"FileUtility"というスクリプトでrecordScoresハンドラーをコマンドとして呼び出すには、次のコマンドを使う代わりに...

FileUtility.recordScores 2017, rawScores

あなたは代わりにTellを使うことができます、このように:

Tell FileUtility to recordScores 2017, rawScores

同様に、"BusinessCenter"スクリプトでconsolidatedSalesハンドラーを関数として呼び出すには、次のようにする代わりに:

put BusinessCenter's consolidatedSales("Ohio") into ohioSales

... あなたは代わりにTellを使うことができます、このように:

Tell BusinessCenter to put consolidatedSales("Ohio") into ohioSales

これらの例は、コードの意図を明確にし、可読性を向上させる以外の大きな付加価値を提供するものではないかもしれません。Tellの真のユーティリティは、Tellのブロック形式を使用して特定のオブジェクトに対して複数のコマンドと関数をターゲットにする場合、またはオブジェクトがスクリプトではなく変数に格納されている場合に現れます。

例:

以下は、Tellのブロック形式を使用する例です。

Tell BusinessCenter
put consolidatedSales("Ohio") into ohioSales
put consolidatedSales("Pennsylvania") into pennsylvaniaSales
put consolidatedSales("California") into californiaSales
End Tell

例:

これは、"StandardDeck"スクリプトから作成されたdeckofCardsオブジェクトを関与させる例です。

set deckOfCards to a new StandardDeck with {jokers:No} -- Set up the test with a standard deck and no jokers

// Use Tell to shuffle a deck of cards and deal two Poker hands:
tell deckOfCards -- Directs the following commands and functions to the deckOfCards object
shuffle -- Shuffle command is sent to DeckOfCards object
put dealCards(5) into pokerHand1 -- Sends the dealCards function message, with a parameter of 5, to the deckOfCards object and stores the output in pokerHand1
put dealCards(5) into pokerHand2 -- Repeats the same as the prior command but stores the output in pokerHand2
end tell

// Print the output to the run window:
put "Hand 1: " & pokerHand1
put "Hand 2: " & pokerHand2

Send コマンド

動作: メッセージを他のオブジェクトに送ります。Messageはテキストとして評価される式です。送信されるメッセージにはパラメーターが含まれることがあります。これは、メッセージ文字列内(calculateLoanの例のように)または別途(accrueInterestの例のように)指定します。objectが指定されていない場合、メッセージはオブジェクト me(つまり、スクリプトを含むオブジェクト)に送られます。

構文:
the target
target()

例:

send "Hello" to newObject

例:

この例では、パラメーターは_message_文字列とは別に渡されます。

send "calculateLoan 10,9,5000" to "Loan"

例:

この例では、パラメーターは_message_文字列内に含まれています。

send accrueInterest 30, 4.625 to account

Target 関数

動作: 現在のメッセージが送信されたオブジェクトのロングIDを返します。メッセージの原始ターゲットが何であったかを知る必要があるときに、メッセージパスの下のハンドラーで役立ちます。

構文: the target
target()

SenseTalkバージョン1.1以降、the targetの構文を使用すると、ターゲットオブジェクトに直接アクセスできます。target()構文は、メッセージパスの他のスクリプトでオーバーライドされていない場合に、ターゲットオブジェクトのロングIDを返す関数を呼び出します。これは、ほとんどの目的で同等に機能しますが、場合によっては少し効率が低くなるかもしれません。

例:

if the target is not me then ...

Do コマンド

動作: doコマンドは_expression_を一つまたは複数のSenseTalk文として評価し、それらの文を現在のハンドラーの一部であるかのように実行します。これは、_expression_に含まれる文がハンドラーのローカル変数を参照、使用、変更できることを意味します(ただし、the evaluationContextグローバルプロパティがGlobalまたはUniversalに設定されている場合、未宣言の変数はローカル変数ではなくグローバルまたはユニバーサル変数として扱われます)。

doコマンドを使用してコードを実行することは、同じ文を直接スクリプトに含めるよりも遅いです。なぜなら、SenseTalkコンパイラーは、コードが実行される前に毎回コードをコンパイルするからです。doコマンドが多数回、例えばrepeatループ内で実行される場合、パフォーマンスへの影響は特に大きくなります。

構文: do expression

例:

do "put total into quarter" & currentQtrNumber

例:

do customCleanupCode

Do AppleScript コマンド, DoAppleScript 関数

doAppleScript関数を使用して実行した場合、AppleScript表現の最終値は関数の戻り値となります。エラーはthe resultの例外オブジェクトとして戻されます。do AppleScriptがコマンドとして実行された場合、the resultには例外オブジェクトか表現の最終値が含まれます。

[**構文:**md do AppleScript expression
do expression as AppleScript

関数として:
doAppleScript( expression )

do acquireDataScript as AppleScript
"eggPlant" を app に代入する
-- 表示しておきたいアプリの名前
do AppleScript merge of {{
tell application "Finder"
activate
set visible of every process whose name is not "[[app]]" to false
end tell
}}
}}
Tech Talk

do AppleScriptコマンドは_expression_をAppleScriptの文として評価し、AppleScriptのインタープリタを呼び出してそれらの文を実行します。AppleScriptコードの任意の位置で値を渡すことができ、そのためにはコード内でSenseTalkのローカル変数名や表現を二重角括弧 [[ ]] で囲み、merge関数を使用してその値をAppleScriptを実行する前に挿入します。

動作: AppleScriptスクリプティング言語で書かれた一つまたは複数の文を実行します。これらの文は変数に含まれているか、ランタイムでスクリプトによって生成されます。最終値またはエラーは the result で利用可能になります。

AppleScriptのコードはローカルマシン上で実行されます。このメカニズムを使用して別のマシンにメッセージを送信するには、別のマシンでシステム環境設定の共有パネルでリモートイベントをオンにする必要があり、また、あなたのAppleScriptコードは次のようなtell文を使ってそのマシンにコマンドを送信する必要があります:

tell application "AppName" of machine "eppc://userName:password@xxx.xxx.xxx.xxx"

詳細については、AppleScriptのリファレンスを参照してください。

[ ] (角括弧メッセージング)

動作: 角括弧を使用して、特定のオブジェクトに関数型メッセージを送信します。角括弧構文は、単独で文として使用することも、式の一部として関数呼び出しのように使用することもできます。ただし、どちらの場合も送信するメッセージは関数メッセージであるため、toまたはfunctionハンドラ(onハンドラではない)によって処理される必要があります。

構文:
[ object functionMessage ]
[ object functionMessage : parameters ]

例:

[currentLoan computeInterest:10,9,5000]

例:

answer "The result is: " & [calculator getResult]