2008-10-22 21 views

Trả lời

8

tôi thấy description này:

ngoài vs lặp nội bộ.

Bộ lặp ngoài - khi lặp lại được điều khiển bởi đối tượng bộ sưu tập, chúng tôi nói rằng chúng tôi có Bộ lặp ngoài.

Trong các ngôn ngữ như .net hoặc java, việc tạo các trình vòng lặp bên ngoài rất dễ dàng. Trong thực hiện cổ điển của chúng tôi một trình lặp bên ngoài được thực hiện. Trong ví dụ sau một iterator bên ngoài được sử dụng:

// using iterators for a clloection of String objects: 
// using in a for loop 
for (Iterator it = options.iterator(); it.hasNext();) { 
    String name = (String)it.next(); 
    System.out.println(name); 
} 

// using in while loop 
Iterator name = options.iterator(); 
    while (name.hasNext()){ 
     System.out.println(name.next()); 
    } 

// using in a for-each loop (syntax available from java 1.5 and above) 
    for (Object item : options) 
     System.out.println(((String)item)); 

Vòng lặp nội bộ - Khi iterator kiểm soát nó, chúng ta có một iterator nội

Ở phía bên kia thực hiện và sử dụng vòng lặp nội bộ là thực sự khó khăn. Khi một iterator nội bộ được sử dụng nó có nghĩa là mã được chạy được ủy quyền cho đối tượng tổng hợp. Ví dụ: trong các ngôn ngữ cung cấp hỗ trợ cho việc này dễ dàng gọi các trình lặp nội bộ:

collection do: [:each | each doSomething] (Smalltalk) 

Ý tưởng chính là chuyển mã được thực hiện cho bộ sưu tập. Sau đó, bộ sưu tập sẽ gọi nội bộ phương thức doSomething trên mỗi thành phần. Trong C++ nó có thể gửi phương thức doMethod như một con trỏ. Trong C#, .NET hoặc VB.NET, bạn có thể gửi phương thức này làm đại biểu. Trong java, mẫu thiết kế Functor phải được sử dụng. Ý tưởng chính là tạo một giao diện cơ sở chỉ với một phương thức (doSomething). Sau đó, phương thức sẽ được thực hiện trong một lớp thực hiện giao diện và lớp sẽ được chuyển tới bộ sưu tập để lặp lại. Để biết thêm chi tiết, hãy xem mẫu thiết kế Functor.

17

ngoài Iterator

Khi bạn nhận được một iterator và bước qua nó, đó là một iterator bên ngoài

for (Iterator iter = var.iterator(); iter.hasNext();) { 
    Object obj = iter.next(); 
    // Operate on obj 
} 

nội Iterator

Khi bạn vượt qua một đối tượng hàm đến một phương pháp để chạy qua danh sách, đó là trình lặp nội bộ

var.each(new Functor() { 
    public void operate(Object arg) { 
    arg *= 2; 
    } 
}); 
+1

Vì Java 5 cách ưu tiên để sử dụng một vòng lặp bên ngoài, sẽ sử dụng vòng lặp for-each: * cho (Object o: var) {// NOOP} * mặc dù nó chỉ đơn thuần là cú pháp đường cho trình lặp lặp rõ ràng bằng cách sử dụng phiên bản. – Alex

+1

@JohannZacharee không phải là vòng lặp foreach được coi là một Iterator nội bộ, vì chúng ta không có quyền kiểm soát vòng lặp? – denis631

+1

@ denis631 Có, tôi đồng ý rằng vòng lặp foreach hoạt động tương tự như một trình lặp nội bộ. Tôi đã không sử dụng nó như là ví dụ của tôi vì sự hiểu biết của tôi là Java chuyển đổi chúng thành một trình lặp bên ngoài tại thời gian biên dịch. Tôi đã chọn một ví dụ chức năng để minh họa rõ hơn sự khác biệt. –

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