4

次に例を示します。

int[] arr = [ 1, 2, 3, 4, 5 ];
auto foo = filter!("a < 3")(arr);
assert(foo == [ 1, 2 ]); // works fine

今私は述語をパラメータ化できるようにしたい、例えば

int max = 3;
int[] arr = [ 1, 2, 3, 4, 5 ];
auto foo = filter!("a < max")(arr); // doesn't compile

filter!() の述語は 1 つのパラメーターしか受け入れないため、このスニペットは明らかにコンパイルされません。古き良き for/foreach ループに頼らずに、この制限を克服する方法はありますか?

4

2 に答える 2

3

文字列ラムダは単なるライブラリ レベルの利便性であり、D の組み込み関数/デリゲート/テンプレート リテラルよりもさらに簡潔になるように設計されています。より多くの電力が必要な場合は、次のようにします。

注: 以下は機能するはずですが、コンパイラのバグにより、執筆時点では動作が不安定になる可能性があります。

import std.algorithm;

void main() {
    int max = 3;
    int[] arr = [ 1, 2, 3, 4, 5 ];
    auto foo = filter!((a) { return a < max; })(arr);
}

以下は実際に機能します。

import std.algorithm;

void main() {
    int max = 3;
    int[] arr = [ 1, 2, 3, 4, 5 ];
    auto foo = filter!((int a) { return a < max; })(arr); 
}

違いは、型が明示的に指定されているかどうかです。

于 2010-10-05T15:04:55.207 に答える
3

dsimcha の回答に加えて、必要に応じてローカル関数を使用することもできます。

int max = 3;
bool pred(int a) { return a < max; };
int[] arr = [1, 2, 3, 4, 5];
auto foo = filter!(pred)(arr);
于 2010-10-05T17:14:16.710 に答える