以下是一个例子:
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循环?
答案 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);