「
デリゲート
」を編集中
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
{{Alert|この記事のより新しい版が[https://docs.wsoft.ws/products/alice/api/delegate/ WSOFTDocs]にあります。AliceScriptWikiでは、この記事はもう更新されません。||04}}[[Category:Alice(名前空間)]] [[Category:基本]] デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。 例えば、蔵書検索アプリケーションを作成することを考えてみましょう。この検索の条件は、それと完全に一致する、それを含む、それを含まない、の3つが用意されています。いずれの場合も、Seartch()関数が行うことは基本的に同じです。つまり、なんらかの条件に基づいて一連の蔵書から項目を検索します。しかし、条件に基づいて検索するコードはそれぞれの条件によって異なります。 そのような場面でデリゲートを使うと、変数のように値を変更することでプログラムの実行中に処理内容を切り替えることができます。Seartch関数に関連づけられているデリゲートを変更すればよいのです。 ソフトウェアには、この種の手法が半世紀にわたって使用されてきました。AliceScriptのデリゲートは、さらに思い通りのプログラミングを実現します。 デリゲートには次の特徴があります。 *デリゲートを使用すると、関数を引数として渡すことができます。 *デリゲートは、コールバック関数の仕組みを実現するのに使用できます。 *デリゲートは連結でき、たとえば、複数の関数を一度の呼び出しで実行することができます。 この記事では<code>delegate</code>キーワードまたはラムダ式によって提供される機能、<code>delegate</code>型に実装される機能を説明します。 [[Category:基本]][[Category:Alice(名前空間)]] {| class="wikitable" |+delegate |- |名前空間 |Alice |- |アセンブリ |ローカル |- |サポート |AliceScript1 |- |属性 |言語構造 |} ==基本== デリゲート型は、<code>delegate</code>キーワードと、そのデリゲートの実行に必要な引数を指定して宣言されます。 引数はかっこで囲み、各引数をコンマで区切ります。括弧内を空にすると、デリゲートは引数が不要なことを意味します。 デリゲートを同期的に呼び出すには関数のように丸括弧を使用して呼び出すか、<code>Invoke</code>メソッド使用し、非同期的に呼び出すには<code>BeginInvoke</code>メソッドを使用します。 また基本的には、引数の指定方法や戻り値に関する詳細は関数と同じです。詳しく知るには[[関数]]の記事も参照してください。 次の例にはデリゲートを生成し、それを<code>SayHello</code>として定義します。<code>SayHello</code>が呼び出されたとき、標準出力にHello,World!を書き込みます。 var SayHello = delegate() { print("Hello,World!"); } SayHello();//出力例:Hello,World! ==ラムダ式== ラムダ式を用いてデリゲートを生成することもできます。[[式#ラムダ演算子|ラムダ演算子<code>=></code>]]は、引数指定部と式本体を分割する役割を持ちます。 ラムダ式には、次の2つの形式があります。 ===式形式のラムダ=== 式形式のラムダは、次の形です。 (input-parameters) => expression 式形式のラムダは、呼び出された時にその式の値を返します。 例えば、次のような関数が定義されていたとします。この関数は、与えられた数<code>num</code>を二乗した結果を返します。 function pow(number num) { return num ** 2; } print(pow(2));//出力例:4 次の例は、この関数と等価な結果を返すデリゲートをラムダ式で定義する例です。 var pow = (number num) => num ** 2; print(pow(2));//出力例:4 ===ステートメント形式のラムダ=== ステートメント形式のラムダは次の形です。 (input-parameters) => { <sequence-of-statements> } 式形式のラムダとの違いは、ステートメント形式のラムダの本体が任意の数のステートメントで構成できる点と、<code>return</code>キーワードを使用することでのみ値を返すことができることです。次の例では、<code>x</code>を二乗した値を出力するデリゲートを<code>powoutput</code>という名前で宣言します。 var powoutput = (x) => { var powed = x*x; print(x); }; powoutput(2);//出力例:4 ==関数からの暗黙的な変換== ほとんどのネイティブ関数とユーザー定義関数は、デリゲート型の変数へと暗黙的に変換できます。ユーザー定義関数を丸括弧なしで呼び出すと、それはその関数をデリゲート型に変換されたオペランドと認識されます。次に例を示します。 function SayHello() { print(“Hello,World”); } var hello=SayHello;//helloは、DELEGATE型を表します hello();//出力:Hello,World ただし、以下の属性を持っている関数を暗黙的に変換することはできません。 *言語構造 *関数の区切り文字の空白をサポート *単一の引数のみ関数の区切り文字の空白をサポート また、FunctionBase型を継承しない関数も、この機能をサポートしません。 関数の属性について詳しく知るには、[[関数#属性|関数]]の記事を参照してください。 ==デリゲートの組み合わせ== デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、<code>foreach</code>文を使用して一つずつに分解することも可能です。上記の例ですでに<code>SayHello</code>を定義しましたから、もう一つ、<code>SayBonjur</code>デリゲートを定義し、それらを結合して実行する例を示します。 var SayBonjur = delegate() { print(“Bonjur”); } var Say = SayHello+SayBonjur; Say(); //出力例:Hello,World! // :Bonjur ==イベント駆動型プログラム== イベント駆動型プログラムは例えば「キーボードが押下された」とか、「マウスが移動した」などの受動的なイベントの発生によってコードが実行されるプログラムです。AliceScriptでは、デリゲート型とその組み合わせによって実現できます。ここでは簡単なサンプルとして、1秒おきにHello,Worldを表示し続け、それをeキーが押下されたときに停止するプログラムを作成します。このコードでは非同期的に1秒前にHello,Worldを表示し続け、同時に同期的にキーの押下を待機し続け、なんらかのキーが押下されたときに<code>OnkeyDown</code>にキーの情報を渡して呼び出します。 var OnKeyDown; (()=>{ //非同期に実行されるコード while(true) { OnKeyDown(Console_ReadKey()); } }).BeginInvoke(); //OnKeyDownに次のコードをイベントハンドラとして登録します OnKeyDown+=(key)=> { if(key==“e”) { exit; } } while(true) { print(“Hello,World”); delay(1000); } 実際に実行すると次のように動作します。 Hello,World Hello,World Hello,World Hello,World eキーを押下すると終了します =Invoke= variable delegate.Invoke(params args); 現在のデリゲートに指定された引数を渡して実行し、その戻り値を返します。 =BeginInvoke= void delegate.BeginInvoke(params args); 現在のデリゲートをすべて非同期で実行します。 =Length/Count= number delegate.Length; number delegate.Count; 現在のデリゲートに含まれる要素の数を返します。
編集内容の要約:
AliceScript Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
AliceScript Wiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
このページで使用されているテンプレート:
テンプレート:Alert
(
編集
)
テンプレート:Func-getcolor
(
編集
)
テンプレート:Func-getsafe
(
編集
)
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
案内
メインページ
ツアー
ダウンロード
規約
おまかせ表示
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報