2012-01-04 36 views
10

Trong D, làm thế nào để tôi áp dụng một hàm cho tất cả các phần tử trong một mảng?Trong D, làm cách nào để áp dụng một hàm cho tất cả các phần tử trong một mảng?

Ví dụ: tôi muốn áp dụng hàm std.string.leftJustify() cho tất cả các phần tử trong một mảng chuỗi.

Tôi biết tôi có thể sử dụng vòng lặp nhưng có chức năng bản đồ tốt không? Tôi thấy có một trong thư viện std.algorithm nhưng tôi không biết cách sử dụng mẫu trong D.

Bất kỳ ví dụ nào?

Trả lời

12

Có rất nhiều tùy chọn để chỉ định lambda. map trả về một phạm vi đánh giá uể oải khi nó được tiêu thụ. Bạn có thể buộc đánh giá ngay lập tức bằng cách sử dụng hàm array từ std.array.

import std.algorithm; 
import std.stdio; 
import std.string; 

void main() 
{ 
    auto x = ["test", "foo", "bar"]; 
    writeln(x); 

    auto lj = map!"a.leftJustify(10)"(x); // using string mixins 
    // alternative syntaxes: 
    // auto lj = map!q{a.leftJustify(10)}(x); 
    // auto lj = map!(delegate(a) { return a.leftJustify(10) })(x); 
    // auto lj = map!(a => a.leftJustify(10))(x); available in dmd 2.058 
    writeln(lj); 
} 
+0

từ khóa "đại biểu" là tùy chọn, vì vậy bạn có thể viết chỉ lj = map tự động! ((A) {return a.leftJustify (10);}) (x); – Nekuromento

+0

Tôi không tin điều này làm những gì OP muốn. Ở đây, 'x' sẽ không thay đổi. Tôi tin rằng anh ấy muốn sửa đổi các yếu tố tại chỗ. –

+0

Không nên chỉ có thể vượt qua một đại biểu với tham số ref thay đổi phần tử? – Trass3r

4
import std.algorithm; 
import std.stdio; 

void main() 
{ 
    writeln(map!(a => a * 2)([1, 2, 3])); 
    writeln(map!(delegate(a) { return a * 2; })([1, 2, 3])); 
} 
+3

Phần trên cùng sử dụng cú pháp lambda mới sẽ không hoạt động cho đến khi DMD 2.058 xuất hiện. – eco

+0

Tôi có thể sử dụng ký hiệu này để áp dụng hàm chuỗi ở trên cho tất cả các phần tử không? –

+0

@GaryWilloughby: Có. – DejanLekic

Các vấn đề liên quan