2010-06-15 39 views
7

làm thế nào tôi có thể làm cho một lớp có thể sử dụng trong một tuyên bố foreach?Làm thế nào để tạo ra một đối tượng (lớp) có thể xử lý được trong D?

Lớp học chứa một mảng kết hợp (ví dụ: chuỗi [chuỗi]). Vì vậy, tuyên bố foreach sử dụng mảng này làm nguồn.

Vì vậy, đây là những gì tôi muốn:

auto obj = new Obj(); 
foreach (key, value; obj) 
{ 
    ... 
} 

Tôi có cần phải thực hiện một someting giao diện như vậy?

EDIT:

Giải pháp:

public int opApply(int delegate(ref string, ref Type) dg) 
{ 
    int result = 0; 

    foreach (ref key, ref value; data) 
    { 
     result = dg(key, value); 
     if (result != 0) 
     { 
      break; 
     } 
    } 

    return result; 
} 

Cùng được thực hiện cho public int opApply (int đại biểu (ref Type) dg).

Trả lời

4

D1:

class Foo 
{ 
    uint array[2]; 

    int opApply(int delegate(ref uint) dg) 
    { 
     int result = 0; 

     for (int i = 0; i < array.length; i++) 
     { 
      result = dg(array[i]); 
      if (result) 
       break; 
     } 
     return result; 
    } 
} 

D2:

Iteration đối với đối tượng struct và class có thể được thực hiện với phạm vi, điều đó có nghĩa [một bộ] thuộc tính phải được xác định:

+2

Tôi không nghĩ rằng dãy dựa trên hỗ trợ foreach giải nén được nêu ra. Và 'opApply' cũng có thể được sử dụng trong D2. – kennytm

+0

opApply là giải pháp, thnx! – VDVLeon

2

Các giải pháp được đăng bởi OP là một giải pháp hợp lệ, nhưng trong D2 có một giải pháp khác với một bộ cân bằng khác nhau. Lặp lại trong D có thể được chia thành lặp nội bộ, được xử lý bởi opApply và lặp lại bên ngoài, được xử lý bởi các phạm vi.

Lặp lại nội bộ cho đối tượng được lặp qua kiểm soát ngăn xếp cuộc gọi. Điều này cho phép, ví dụ, đệ quy được sử dụng bởi các đối tượng được lặp đi lặp lại mà không duy trì một ngăn xếp rõ ràng, nhưng làm cho iterating qua nhiều cấu trúc trong lockstep không thể. Lặp lại bên ngoài làm ngược lại.

Lặp lại bên ngoài được thực hiện qua các phạm vi. Phạm vi là bất kỳ lớp hoặc cấu trúc nào xác định ba phương thức: front() cấp quyền truy cập vào phần tử đầu tiên trong phạm vi, popFront() tiến tới phạm vi và empty() trả về true nếu phạm vi trống. Nếu phạm vi là vô hạn, thì có thể khai báo trống dưới dạng hằng số thay vì hàm thành viên. Bằng cách này, người gọi có quyền kiểm soát ngăn xếp cuộc gọi, đó là một sự cân bằng có thể tốt hay xấu tùy thuộc vào tình huống.

Dưới đây là một ví dụ của việc sử dụng phạm vi cho lặp:

/**This struct lazily produces all Fibonacci numbers.*/ 
struct Fibonacci { 
    ulong num1 = 0; 
    ulong num2 = 1; 

    ulong front() { 
     return num1 + num2; 
    } 

    void popFront() { 
     auto newNum2 = num1 + num2; 
     num1 = num2; 
     num2 = newNum2; 
    } 

    // A range of Fibonacci numbers is infinite. 
    enum bool empty = false; 
} 
+0

Vì vậy, có một trình biên dịch viết lại cho 'foreach (khóa, giá trị; bộ sưu tập)' về phạm vi nguyên thủy? Tôi chưa thấy gì cả, tôi chỉ hy vọng: D – Tim

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