パラメータと結果
メッセージは、メッセージ名という単語で識別されますが、_パラメータ_の形で追加情報を含めることもできます。パラメータは、コマンドや関数に渡される値です。これらのコマンドや関数はカスタ ムハンドラであり、呼び出しスクリプト内に存在するか、別のスクリプトやヘルパースイート内に存在することがあります。ハンドラの宣言やパラメータの受け取りについての詳細は、ハンドラをご覧ください。
パラメータの2つの渡し方:シーケンシャルと名前付き
コマンドや関数を呼び出すときにパラメータを渡す方法は2つあります:シーケンシャル(順序通り)と名前付きです。シーケンシャルパラメータは、想像通りの順序で渡されます。名前付きパラメータは、_key:value_のペアのプロパティリストとして渡され、各キーが受け取り側のパラメータの名前と一致するように使用されます。これら2つのパラメータの渡し方は組み合わせることもできます。
呼び出しコマンドや関数は、呼び出されるハンドラと同じスクリプト内にあることも、異なるスクリプト内にあることもあります。呼び出しは多くの場合、別のスクリプト内にあり、これはテストのモジュラ化に有用です。テスト構造には、様々なタスクを実行する多種多様なハンドラを含む他のスクリプトへのいくつかの異なる呼び出しを含むプライマリスクリプトが含まれることがあります。
受け取りハンドラが期待する任意のパラメータにデフォルト値を事前に定義することに興味がある場合は、デフォルトのパラメータ値を参照してください。パラメータを受け取るハンドラの作成については、ハンドラを参照してください。
シーケンシャルパラメータ
シーケンシャルパラメータの渡し方
シーケンシャルパラメータを渡すためには、コマンド名の後にパラメータ値を列挙し、コンマで区切るか、関数を呼び出すときに関数名の後の括弧内に含めます(単一のパラメータ値が渡されるときの関数の他のバリエーションもあります - 関数の呼び出しを参照)。
コマンド put "Hello, World!"は、"Hello, World!"という文字列を単一のパラメータとしてput
メッセージと共に送信します。複数のパラメータを送信するには、それらをコンマで区切って列挙します。
例:コマンドでシーケンシャルパラメータを渡す
この例では、数値31
、テキストgreen
、変数style
の3つのパラメータをシーケンシャルパラメータとしてdoSomethingImportant
コマンドに渡します:
doSomethingImportant 31, "green", style
コマンドのパラメータは括弧で囲むべきではありません(単一のパラメータとしてリストを渡す意図がある場合を除く)。
例:関数でシーケンシャルパラメータを渡す
関数呼び出し メッセージにパラメータを含めるには、関数名の後の括弧内にそれらを列挙します:
put roundToNearest(salary/12, 0.01) into monthlyPayTothePenny
例:空のパラメータを供給する
2つのコンマが連続すると空のパラメータを意味し、リストの最後のコンマは無視されるので、次の例では3つのパラメータ("silverBar"、""、16)が渡されます:
get verifyQuantity("silverBar",,16,)
シーケンシャルパラメータの割り当て
パラメータが順序に従って渡されると、その値はハンドラ宣言の一部であるパラメータ変数に(同じ順序で)割り当てられます。呼び出し元がパラメータ変数の数よりも少ない値を渡すと、割り当てられなかったものはそのデフォルト値(または空)を受け取ります。呼び出し元がより多くの値を渡す場合、ハンドラはそれらにparameterList
関数、paramCount
関数、param
関数を使用してアクセスできます。
例:
例えば、以下のように宣言されたcastSpell
ハンドラを考えてみましょう。
to castSpell spellName, duration, potency -- "to"を使って、この行はcastSpellハンドラを宣言し、3つのパラメータ変数を定義します
//魔法を唱えるためのことをします:
Put duration and potency into Cauldron
Stir Cauldron -- 魔法を実行するカスタムコール
Log "Alakazam!: " & spellName -- 魔法が唱えられたことを確認するメッセージ
end castSpell
ここで、spellName
、duration
、potency
は、ハンドラが呼び出されたときに渡されるパラメータの値を受け取るパラメータ変数です。
上記のハンドラがコマンドcastSpell "sleep", 12 hours, "deep"
を使って呼び出された場合、スクリプト全体は以下のようになるでしょう。
castSpell "sleep", 12 hours, "deep" --これは呼び出しコマンドで、3つのパラメータを順序に従って渡します
to castSpell spellName, duration, potency --順序に従って渡されたパラメータは、受け取られてその順序に従って対応するパラメータ変数に挿入されます
//魔法を唱えるためのことをします:
Put duration and potency into Cauldron
Stir Cauldron -- 魔法を実行するカスタムコール
Log "Alakazam!: " & spellName -- 魔法が唱えられたことを確認するメッセージ
end castSpell
この場合、値"sleep"
はパラメータ変数spellName
に、値12時間
はduration
に、"deep"
はpotency
変数に割り当てられます。
同じハンドラがコマンドcastSpell "sleep"
を使用して呼び出されたと仮定します:
castSpell "sleep"
to castSpell spellName, duration, potency
//魔法を唱えるための操作をします!
TypeText "Alakazam!"
end castSpell
この場合、一つだけのパラメータ値が提供されています。 値"sleep"
は以前と同じようにパラメータ変数castSpell
に割り当てられますが、duration
とpotency
変数に対する値が与えられていないため、それらはデフォルト値(または、この場合、ハンドラがデフォルト値を定義していないので、empty
)に初期化されます。
また、ハンドラはパラメータ変数よりも多いパラメータ値で呼び出されることもあります:
castSpell "sleep", 12 hours, "deep", stardust
to castSpell spellName, duration, potency
//魔法を唱えるための操作をします!
TypeText "Alakazam!"
end castSpell
この場合、最初の3つの値は通常通り3つのパラメータ変数に割り当てられます。追加の値、stardustは任意の変数に割り当てられませんが、ハンドラ内でparam
関数を使用してparam(4)
として利用可能です。 呼び出し元によって渡された順序パラメータの値の数は、paramCount
関数を使用して取得可能で、この場合は4
を返します。 そして、渡された順序パラメータの全リストはparameterList
として利用可能です。
呼び出されたハンドラは、楕円または三つのピリオド(...
)を使用して、任意の数のパラメータを明示的に受け入れることもできます。この受け入れ方についての詳細は、可変数のパラメータの受け入 れを参照してください。
名前付きパラメータ
名前付きパラメータの渡し方
パラメータを渡す第二の方法は、名前で渡す です。名前でパラメータを渡すためには、プロパティリスト(または_key:value_のペアのシーケンス)を使用し、その後にby name
という単語を使います。ハンドラは、適切な値を受け取るようにプロパティ変数で設定する必要があります。
最終的に渡されるパラメータがプロパティリストや_key:value_のペアのシーケンスでない場合、by name
を使用しても効果はありません。
例:
これらの例はすべて、プロパティリストとして同じパラメータを渡すさまざまな方法を示しています。これはコマンドと関数の両方に対して行います。
プロパティリストを名前でコマンドに渡すさまざまな方法:
orderItem aPropertyList by name
orderItem {id:a, size:b, color:c} by name
orderItem id:a, size:b, color:c by name
プロパティリストを名前で関数に渡すさまざまな方法:
put itemInformation({id:a, size:b, color:c} by name)
put itemInformation(id:a, size:b, color:c by name)
名前付きパラメータの割り当て
名前で渡される任意の値は、同じ名前を持つパラメータ変数に割り当てられます。名前付きパラメータを渡すためには、唯一のパラメータとしてプロパティリストを渡し、その後にby name
という単語を追加します。プロパティリストパラメータ(または_key:value_ペアのシーケンス)がby name
で渡されると、呼び出されたハンドラ内の各パラメータ変数には、変数と同じ名前を持つプロパティリスト内のプロパティの値が割り当てられます。
名前で渡された値の完全なセットは、呼び出されたハンドラ内でparametersByName
関数を使用して取得できます。
例: プロパティリストを名前で渡す
この例では、spellName
変数にはプロパティリストのspellName
プロパティの値が割り当てられ、duration
プロパティの値はduration
パラメータ変数に割り当てられ、以下同様です。もしプロパティリストがパラメータ変数の一つに対応するプロパティ名を持っていない場合、その変数は割り当てられたデフォルト値(またはデフォルト値がない場合は空)から始まります。
set deepSleep to {spellName:"sleep", potency:"deep"} -- これはプロパティリストを変数に格納します
castSpell deepSleep by name -- castSpellハンドラを呼び出し、単一のプロパティリストを渡します。'by name'キーワードは、プロパティリストの値がプロパティキーと一致するパラメータ変数に割り当てられるようにします
to castSpell spellName, duration, potency -- 名前で渡されたパラメータは受け取られ、それらの値は対応するパラメータ変数に挿入されます
//呪文を唱えるための処理:
Put duration and potency into Cauldron
Stir Cauldron
Log "Alakazam!: " & spellName
end castSpell
名前で渡されるプロパティリストは、式の結果であることもあります。例えば、このコマンドはdeepSleep
プロパティリストのプロパティにduration
プロパティを追加し、その結果のプロパティを名前で渡します:
castSpell deepSleep adding {duration: 1 hr} by name
もちろん、プロパティリストは呼び出し行で直接指定することもできます:
castSpell {spellName:"sleep", potency:"deep", duration:15 minutes} by name
または、このようにブレースを省略することもできます:
castSpell duration:15 minutes, spellName:"sleep", potency:"deep" by name
連続的なパラメータと名前付きパラメータの両方
ハンドラへのパラメータの渡し方として、連続的なパラメータと名前付きパラメータの組み合わせを使うことも可能です。これを行うには、まず連続的なパラメータを指定し、その後に名前付きパラメータとby name
を続けます:
castSpell "sleep", potency:"deep" by name
この場合、最初のパラメータである"sleep"
は名前がついていないため、連続的に渡され、したがって最初のパラメータ変数spellName
に割り当てられます。これに続いてby name
で渡されるプ ロパティリストがあり、プロパティ名potency
がpotency
パラメータ変数にマッチし、その値に"deep"
が割り当てられます。
パラメータの数
SenseTalkでは、コマンドや関数が呼び出されると、渡されたまたは期待されるパラメータの数に関係なく、その名前のカスタムハンドラや組み込みのコマンドや関数を呼び出します。渡されるパラメータの数が呼び出されるハンドラが期待する数と一致しない場合、その差をさまざまな方法で処理することがあります:例外がスローされるか、余分な値が無視されるか、供給されなかったパラメータに対してデフォルトの値が想定されるかもしれません。呼び出されたハンドラは、受け取ったものを適切に処理してランタイムで応答します。詳細は、渡されたパラメータの受け取りを参照してください。
リストをパラメータとして渡す
個々のパラメータを渡す代わりに、as parameters
を指定してリストに含まれるすべての値を渡すことができます。これにより、リストは単一のエンティティとしてではなく、リスト内の値が個々に渡されます:
put [candles, 6, blue] into thingsToBeUpdated
updateAllItems thingsToBeUpdated as parameters -- これにより、3つのパラメータが渡されます:変数candles、数値6、変数blue。
"as parameters"を省略すると、リスト全体が一つのパラメータとして渡されます。
これは、現在のハンドラが受け取ったパラメータのリストをそのまま渡す場合に特に便利です:
return otherFunction(parameterList() as parameters)