「デリゲート」の版間の差分
編集の要約なし |
|||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
[[Category:Alice(名前空間)]] | {{Alert|この記事のより新しい版が[https://docs.wsoft.ws/products/alice/api/delegate/ WSOFTDocs]にあります。AliceScriptWikiでは、この記事はもう更新されません。||04}}[[Category:Alice(名前空間)]] | ||
[[Category:基本]] | [[Category:基本]] | ||
デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。 | デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。 | ||
14行目: | 14行目: | ||
*デリゲートは連結でき、たとえば、複数の関数を一度の呼び出しで実行することができます。 | *デリゲートは連結でき、たとえば、複数の関数を一度の呼び出しで実行することができます。 | ||
この記事では<code>delegate</code> | この記事では<code>delegate</code>キーワードまたはラムダ式によって提供される機能、<code>delegate</code>型に実装される機能を説明します。 | ||
[[Category:基本]][[Category:Alice(名前空間)]] | [[Category:基本]][[Category:Alice(名前空間)]] | ||
52行目: | 52行目: | ||
ラムダ式には、次の2つの形式があります。 | ラムダ式には、次の2つの形式があります。 | ||
===式形式のラムダ=== | ===式形式のラムダ=== | ||
式形式のラムダは、次の形です。 | 式形式のラムダは、次の形です。 | ||
(input-parameters) => expression | (input-parameters) => expression | ||
式形式のラムダは、呼び出された時にその式の値を返します。 | |||
var pow = ( | 例えば、次のような関数が定義されていたとします。この関数は、与えられた数<code>num</code>を二乗した結果を返します。 | ||
function pow(number num) | |||
{ | |||
return num ** 2; | |||
} | |||
print(pow(2));//出力例:4 | |||
次の例は、この関数と等価な結果を返すデリゲートをラムダ式で定義する例です。 | |||
var pow = (number num) => num ** 2; | |||
print(pow(2));//出力例:4 | print(pow(2));//出力例:4 | ||
===ステートメント形式のラムダ=== | ===ステートメント形式のラムダ=== | ||
ステートメント形式のラムダは次の形です。 | ステートメント形式のラムダは次の形です。 | ||
70行目: | 75行目: | ||
}; | }; | ||
powoutput(2);//出力例:4 | powoutput(2);//出力例:4 | ||
==関数からの暗黙的な変換== | ==関数からの暗黙的な変換== | ||
ほとんどのネイティブ関数とユーザー定義関数は、デリゲート型の変数へと暗黙的に変換できます。ユーザー定義関数を丸括弧なしで呼び出すと、それはその関数をデリゲート型に変換されたオペランドと認識されます。次に例を示します。 | ほとんどのネイティブ関数とユーザー定義関数は、デリゲート型の変数へと暗黙的に変換できます。ユーザー定義関数を丸括弧なしで呼び出すと、それはその関数をデリゲート型に変換されたオペランドと認識されます。次に例を示します。 | ||
94行目: | 90行目: | ||
関数の属性について詳しく知るには、[[関数#属性|関数]]の記事を参照してください。 | 関数の属性について詳しく知るには、[[関数#属性|関数]]の記事を参照してください。 | ||
==デリゲートの組み合わせ== | ==デリゲートの組み合わせ== | ||
デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、<code>foreach</code>文を使用して一つずつに分解することも可能です。上記の例ですでに<code>SayHello</code>を定義しましたから、もう一つ、<code>SayBonjur</code>デリゲートを定義し、それらを結合して実行する例を示します。 | デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、<code>foreach</code>文を使用して一つずつに分解することも可能です。上記の例ですでに<code>SayHello</code>を定義しましたから、もう一つ、<code>SayBonjur</code>デリゲートを定義し、それらを結合して実行する例を示します。 | ||
var SayBonjur = delegate() | var SayBonjur = delegate() | ||
{ | { | ||
106行目: | 100行目: | ||
//出力例:Hello,World! | //出力例:Hello,World! | ||
// :Bonjur | // :Bonjur | ||
==イベント駆動型プログラム== | ==イベント駆動型プログラム== | ||
イベント駆動型プログラムは例えば「キーボードが押下された」とか、「マウスが移動した」などの受動的なイベントの発生によってコードが実行されるプログラムです。AliceScriptでは、デリゲート型とその組み合わせによって実現できます。ここでは簡単なサンプルとして、1秒おきにHello,Worldを表示し続け、それをeキーが押下されたときに停止するプログラムを作成します。このコードでは非同期的に1秒前にHello,Worldを表示し続け、同時に同期的にキーの押下を待機し続け、なんらかのキーが押下されたときに<code>OnkeyDown</code>にキーの情報を渡して呼び出します。 | イベント駆動型プログラムは例えば「キーボードが押下された」とか、「マウスが移動した」などの受動的なイベントの発生によってコードが実行されるプログラムです。AliceScriptでは、デリゲート型とその組み合わせによって実現できます。ここでは簡単なサンプルとして、1秒おきにHello,Worldを表示し続け、それをeキーが押下されたときに停止するプログラムを作成します。このコードでは非同期的に1秒前にHello,Worldを表示し続け、同時に同期的にキーの押下を待機し続け、なんらかのキーが押下されたときに<code>OnkeyDown</code>にキーの情報を渡して呼び出します。 |