他のスクリプトやハンドラーの実行
主要なテストスクリプトの外部に他のスクリプトやハンドラーを作成することで、再利用可能なコードの塊を作成し、テストを効率的にモジュール化できます。しかし、一度これらのスクリプトやハンドラーが作成された後、それらをどのように呼び出すのでしょうか?このページではその方法と、関連するいくつかのコマンドと関数を説明します。
ローカルハンドラーまたはスクリプトの呼び出し
ハンドラーまたはスクリプトをコマンドとして呼び出す
構文:
scriptOrHandlerName {parameters}
スクリプト内の別のハンドラーを呼び出すには、単にハンドラー名をコマンドとして使用し、必要なパラメータと共に使用します。例えば、このコマンドを考えてみましょう。
recordScores 2017, rawScores
ローカルスクリプトにrecordScores
メッセージのための"to"(または"on")ハンドラーがある場合、このコマンドはそのハンドラーを実行し、それに2つのパラメータを渡します。
recordScores
コマンドのためのローカルハンドラーがないが、その名前のスクリプトがある場合、そのスクリプト(つまり、スクリプトの初期ハンドラー)が実行され、それに2つのパラメータが渡されます。したがって、いずれの場合も、ローカルスクリプト内のハンドラーを呼び出すには、または同じディレクトリ内の別のスクリプトを呼び出すには、そのハンドラーまたはスクリプト名をコマンドとして使用するだけです。
ハンドラーまたはスクリプトを関数として呼び出す
構文:
scriptOrFunctionName ( {parameters} )
スクリプトまたはハンドラーを関数として呼び出す方法も同じです:スクリプトまたはハンドラー名を関数として使用します。例えば、この関数呼び出しを考えてみましょう。
put consolidatedSales("Ohio") into ohioSales
この場合、ローカルスクリプトにconsolidatedSales
メッセージのための"to"(または"function")ハンドラーがある場合、この関数呼び出しはそのハンドラーを実行し、それにパラメータ値"Ohio"を渡します。そのハンドラーからの戻り値は変数ohioSales
に格納されます。
consolidatedSales
関数のためのローカルハンドラーがないが、その名前のスクリプトがある場合、そのスクリプト(つまり、スクリプトの初期ハンドラー)が実行され、それに値"Ohio"を渡します。そして、そのスクリプトからの戻り値がohioSales
に格納されます。
ほとんどのケースでは、このシンプルな方法で他のスクリプトやハンドラーを呼び出すだけで十分です。コマンドや関数の呼び出しは、現在のスクリプトにメッセージを送り、それがローカルハンドラーによって処理されます。メッセージに対するローカルハンドラーがない場合、メッセージと同じ名前のローカルスクリプトに渡されます。
別のスクリプト内のハンドラーの呼び出し
Syntax:
scriptName . handlerName {parameters}
scriptName 's handlerName {parameters}Syntax:
scriptName . handlerName {parameters}
scriptName . handlerName {parameters}
たまに、他のスクリプト内のハンドラー(初期ハンドラー以外)を呼び出したい場合があります。これを行うには、ドットまたはアポストロフィs表記を使用できます。例えば、"FileUtility"というスクリプト内のto recordScores
ハンドラーをコマンドとして呼び出すには、このコマンドを使用できます:
FileUtility.recordScores 2017, rawScores
同様に、"BusinessCenter"スクリプト内のconsolidatedSales
ハンドラーを関数として呼び出すには、次のようにします:
put BusinessCenter's consolidatedSales("Ohio") into ohioSales
その他のフローコントロールコマンドと関数
これらのあまり使われていないコマンドと関数は、テストの実行フローを制御することを可能にします。
Run
コマンド
動作: scriptName スクリプトを呼び出すか、そのスクリプトの handlerName ハンドラーをコマンドとして呼び出します。HandlerName は通常、引用符なしのハンドラーの単純な名前ですが、引用されたリテラルとして、または実行時にハンドラー名を作成するための括弧内の式としても与えることができます。
Syntax:
run scriptName {,} {parameters}
run scriptName 's handlerName {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
この場合、scriptName
と commandName
の両方とも、呼び出すべきスクリプトとハンドラーの名前を保持する変数として扱われます。この例は "command" タイプのメッセージを送信し、これは "to" または "on" ハンドラーによって処理することができます。
Run
関数
動作: スクリプトや他のオブジェクトの初期ハンドラーを明示的に関数として呼び出します。これにより、ランタイムで動的に生成された名前のスクリプトも呼び出すことができます。run 関数は、ドット表記法のようにターゲットオブジェクトに run メッセージを送信する形で呼び出す必要があります。
構文:
object .run( parameters )
{the} run of object {with parameters}
例:
set doubler to (script:"return 2*param(1)")
put doubler.run(12) -- 24
get ("test" & testNumber).run(value1, value2)
-- スクリプトを動的に呼び出す
Tell
コマンド
動作: このフローコントロールコマンドは、任意のコマンドまたは関数のメッセージターゲットを変更します。通常、一般的なコマンドまたは関数が呼び出されると、そのスクリプトが実行中のオブジェクトにメッセージを送信します(メッセージのターゲット)。そのオブジェクトがそのメッセージのハンドラーを持っていれば、そのハンドラーが実行され、そうでなければ、メッセージはメッセージパスに沿って渡されます。Tell
は、statement
またはStatementList
によって送信される任意の一般的なメッセージのターゲットを変更します(下記の構文を参照)、したがって、それらのメッセージは定義されたobject
に代わりに送信されます。オブジェクトがメッセージのハンドラーを持っていない場合、メッセージは通常通り次のメッセージパスに沿って渡されます。
Syntax:
tell object [ to {:} | : ] statementtell object [ to {:} | :] statement statementList
end tell
ターゲットに送信されるメッセージには以下が含まれます:
- 形式の "generic" コマンドからのコマンドメッセージ: end tell
- 構文:
functionName ( {parameters} )
{the} functionName of parameter
例:
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(つまり、スクリプトを含むオブジェクト)に送られます。
Syntax:
send message {to object}
send message parameters {to object}
例:
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ループ内で実行される場合 、パフォーマンスへの影響は特に大きくなります。
構文: return {expression
例
do "put total into quarter" & currentQtrNumber
例:
do customCleanupCode
Do AppleScript
コマンド, DoAppleScript
関数
doAppleScript
関数を使用して実行した場合、AppleScript表現の最終値は関数の戻り値となります。エラーはthe result
の例外オブジェクトとして戻されます。do AppleScript
がコマンドとして実行された場合、the result
には例外オブジェクトか表現の最終値が含まれます。
Syntax:
do AppleScript expression
do expression as AppleScript関数として:
do AppleScript 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
}}
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
ハンドラではない)によって処理される必要があります。
Syntax:
[ object functionMessage ]
[ object functionMessage : parameters ]
例:
[currentLoan computeInterest:10,9,5000]
例:
answer "The result is: " & [calculator getResult]