September 28, 2011
   import std.file;

	foreach (string dosya; dirEntries("E:\\ZipTest", SpanMode.depth))
	{
		writeln(dosya);
	}

Merhaba,
Yukarıdaki kod içerisinde dosya değişkeninin tipini "string" olarak tanımlamadığımız zaman hata alıyorum. Daha önce kullandığım foreach döngülerinde böyle bir tanımlama yapmamıştım ve çalışmıştı. Şimdi neden dosya değişkeninin tanımlanması için beni zorluyor anlamadım ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 28, 2011

Bunun nedeni, dirEntries()'in (aslında onun döndürmüş olduğu DirIterator türünün) birden fazla opApply() yüklemesinin bulunması:

http://www.d-programming-language.org/phobos/std_file.html#dirEntries

string döndüren yükleme yalnızca klasördeki nesnelerin isimlerini verir. DirEntry yükleme ise klasördeki nesne hakkında daha ayrıntılı bilgi verir. Bu yüklemelerden hangisini istediğimizi bu durumda seçmek zorunda kalıyoruz.

Bazı durumlarda ise açıkça seçmemiz gerekmez. Örneğin eşleme tablolarının da opApply() yüklemeleri vardır ama hangisini istediğimiz değişken adedinden anlaşıldığı için türleri yazmak gerekmez:

import std.stdio;

void main()
{
   int[string] tablo = [ "üç" : 3, "dört" : 4 ];

   // Tek değişkenli opApply()'ı kullanır
   foreach (değer; tablo) {
       writeln(değer);
   }

   // İki değişkenli opApply()'ı kullanır
   foreach (indeks, değer; tablo) {
       writefln("%s => %s", indeks, değer);
   }
}

DirIterator'ın yüklemelerinin ikisi de tek değişkenli olduklarından seçmek gerekiyor.

Yapı ve sınıfları foreach'e uyduran opApply() bana bayağı karışık gelmişti. Şurada 'foreach desteğini opApply işlevleri ile sağlamak' başlığı altında var:

http://ddili.org/ders/d/foreach_opapply.html

O bölümün 2 numaralı problemi de aynen dirEntries()'deki gibi tek değişkenli iki opApply() yüklemesi sunar.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]