D言語の関数オブジェクト
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/03 01:18 UTC 版)
「関数オブジェクト」の記事における「D言語の関数オブジェクト」の解説
D言語には関数オブジェクトとして、デリゲートとクロージャの両方がある。 bool find(T)(T[] haystack, bool delegate(T) needle_test) { foreach ( straw; haystack ) { if ( needle_test(straw) ) return true; } return false;}void main() { int[] haystack = [345, 15, 457, 9, 56, 123, 456]; int needle = 123; bool needleTest(int n) { return n == needle; } assert(find(haystack, &needleTest));} D言語におけるデリゲートとクロージャの違いは、コントロールが変数のスコープから一旦抜けても、変数の寿命が続いているか、そうでないかである。コンパイラにより保守的に、自動的に決定される(後から変数を参照する可能性があればクロージャとする)。 D言語は、関数リテラルやラムダ式もサポートしている。 void main() { int[] haystack = [345, 15, 457, 9, 56, 123, 456]; int needle = 123; assert(find(haystack, (int n) { return n == needle; })); assert(find(haystack, (int n) => n == needle));} コンパイラがインライン化できるようにするため(上記参照)、関数オブジェクトをC++形式の演算子のオーバーロードを用いて宣言することもできる。しかし、D言語ではテンプレート引数として関数等を渡す手法が一般的である。 bool find(T,F)(T[] haystack, F needle_test) { foreach ( straw; haystack ) { if ( needle_test(straw) ) return true; } return false;}void main() { int[] haystack = [345, 15, 457, 9, 56, 123, 456]; int needle = 123; struct NeedleTest { int needle; this(int n) { needle = n; } bool opCall(int n) { return n == needle; } } assert(find(haystack, NeedleTest(needle)));}
※この「D言語の関数オブジェクト」の解説は、「関数オブジェクト」の解説の一部です。
「D言語の関数オブジェクト」を含む「関数オブジェクト」の記事については、「関数オブジェクト」の概要を参照ください。
- D言語の関数オブジェクトのページへのリンク