2010-10-05 48 views
4

下面是一個例子:std.algorithm.filter!()模板有兩個參數而不是一個?

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循環?

回答

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); 
} 

的區別是一個類型是否明確指定。

+0

我編輯您的帖子,但在代表仍在工作。你應該修改你的第二個例子的評論。 – 2010-10-05 16:41:23

+0

@he_the_great:其實都編譯。這一評論來自我從OP複製/粘貼並忘記刪除該評論。雖然現在修復了。 – dsimcha 2010-10-05 16:51:38

3

除了dsimcha的回答,您還可以使用本地功能,如果你喜歡:

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