デリゲート

2021年12月6日 (月) 06:36時点におけるMaster (トーク | 投稿記録)による版 (ページの作成:「デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。

例えば、蔵書検索アプリケーションを作成することを考えてみましょう。この検索にはAND検索、OR検索、完全一致検索が用意されています。 いずれの場合も、Seartch()関数が行うことは基本的に同じです。つまり、なんらかの条件に基づいて一連の蔵書から項目を検索します。しかし、条件に基づいて検索するコードはそれぞれの条件によって異なります。

ソフトウェアには、この種の手法が半世紀にわたって使用されてきました。AliceScriptのデリゲートは、さらに思い通りのプログラミングを実現します。

この記事ではdelegateキーワードとそれによって生成されるコード、delegate型に実装される機能を説明します。

delegate
名前空間 Alice
アセンブリ ローカル
サポート AliceScript1
属性 言語構造

基本

デリゲート型は、delegateキーワードまたはその省略表現_と、そのデリゲートの実行に必要な引数を指定して宣言されます。

引数はかっこで囲み、各引数をコンマで区切ります。括弧内を空にすると、デリゲートは引数が不要なことを意味します。

デリゲートを同期的に呼び出すにはInvokeメソッドを、非同期的に呼び出すにはBeginInvokeメソッドを使用します。 また基本的には、引数の指定方法や戻り値に関する詳細は関数と同じです。詳しく知るには関数の記事も参照してください。

次の例にはデリゲートを生成し、それをSayHelloとして定義します。SayHelloが呼び出されたとき、標準出力にHello,World!を書き込みます。

var SayHello = _()
 {
   print("Hello,World!");
 }
SayHello.Invoke();//出力例:Hello,World

デリゲートの組み合わせ

デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、foreach文を使用して一つずつに分解することも可能です。上記の例ですでにSayHelloを定義しましたから、もう一つ、SayBonjurデリゲートを定義し、それらを結合して実行する例を示します。

var SayBonjur = _()
 {
    print(“Bonjur”);
 }
var Say = SayHello+SayBonjur;
Say.Invoke();
//出力例:Hello,World
//     :Bonjur