Шаблон std.algorithm.filter! () с двумя параметрами вместо одного? - PullRequest
4 голосов
/ 05 октября 2010

Вот пример:

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

Этот фрагмент не будет компилироваться, очевидно, потому что фильтр!Предикат () принимает только один параметр.Есть ли способ преодолеть это ограничение, не прибегая к циклу «добрый старина / foreach»?

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

В дополнение к ответу dsimcha, вы также можете использовать локальную функцию, если вам нравится:

int max = 3;
bool pred(int a) { return a < max; };
int[] arr = [1, 2, 3, 4, 5];
auto foo = filter!(pred)(arr);
3 голосов
/ 05 октября 2010

Строковые лямбды - это просто удобство библиотечного уровня, разработанное для того, чтобы быть даже более кратким, чем встроенные литералы функции D / делегат / шаблон 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); 
}

Разница в том, указан ли тип явно.

...