2008-10-22 20 views

cevap

8

içindedir:

vs Dış iç yineleyiciler.

Harici Yineleyiciler - yineleme koleksiyon nesnesi tarafından kontrol edildiğinde, harici bir yineleyicimiz olduğunu söyleriz.

.net veya java gibi dillerde, harici yineleyiciler oluşturmak çok kolaydır. Klasik uygulamada harici bir yineleyici uygulanır. Aşağıdaki örnekte harici yineleyici kullanılır:

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

İç yineleyicinızı - yineleyici onu kontrol Ne zaman Öte yandan bir iç yineleyici

sahip uygulama ve iç yineleyicinızı kullanarak gerçekten zor. Bir dahili yineleyici kullanıldığında, kodun çalıştırılacağı, toplanmış nesneye aktarıldığı anlamına gelir. için destek sunuyoruz dilde Örneğin bu iç yineleyicinızı çağırmak kolaydır:

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

ana fikir koleksiyonuna yürütülecek kod geçmektir. Daha sonra koleksiyon, bileşenlerin her birinde doSomething yöntemini dahili olarak çağırır. C++ 'da doMethod yöntemini bir işaretçi olarak göndermek mümkündür. C#, .NET veya VB.NET'te yöntemi bir temsilci olarak göndermek mümkündür. Java'da Functor tasarım deseni kullanılmalıdır. Ana fikir, sadece bir yöntemle bir temel Arayüz oluşturmaktır (doSomething). Daha sonra bu yöntem, arayüzü uygulayan bir sınıfta uygulanacak ve sınıf tekrarlanacak koleksiyona aktarılacaktır. Daha fazla ayrıntı için Functor tasarım desenine bakın. Eğer üzerinde çalıştırmak için bir yönteme bir işlev nesnesi geçirdiğinizde

17

Dış Yineleyici

bunun üstesinden bir yineleyici ve adım olsun

, yani harici bir yineleyici

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

İç yineleyici

olduğunu bir liste, bu bir iç yineleyici olduğu

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

Java 5 kullanmak için tercih edilen bir yol yana Bir harici yineleyiciler, her bir döngü için: * için (Object o: var) {// NOOP} * için olmalıdır, ancak sürüm kullanan açık yineleyici için sözdizimsel şekerdir. – Alex

+1

@JohannZacharee, yineleyici üzerinde denetimimiz olmadığı için Dahili Yineleyici olarak düşünülen foreach döngüsü değil mi? – denis631

+1

@ denis631 Evet, foreach döngüsünün bir dahili yineleyiciye benzediğini kabul ediyorum. Anlayışım, Java'nın bunları derleme zamanında harici bir yineleyiciye dönüştürdüğünden beri bunu benim örneğim olarak kullanmadım. Farklılıkları daha iyi açıklamak için işlevsel bir örnek seçtim. –