std.algorithm.filter!()模板有两个参数而不是一个?

时间:2010-10-05 14:14:51

标签: d dmd

以下是一个例子:

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

这段代码显然无法编译,正确的过滤器!()的谓词只接受一个参数。有没有办法克服这个限制,而不诉诸良好的'for / foreach循环?

2 个答案:

答案 0 :(得分:3)

字符串lambdas只是一个库级方便,设计为比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); 
}

区别在于是否明确指定了类型。

答案 1 :(得分:3)

除dsimcha的答案外,如果您愿意,还可以使用本地功能:

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