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

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

4

2 回答 2

3

字符串 lambda 只是库级别的便利,旨在比 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 回答