Bence önce aralıklar için özelleşmiş şu malum üç işlevi, D.ershane'den referansla hatırlayalım...
Aşağıda foreach'in 'for()' işleviyle ifade edilmiş hali bulunuyor ve Ali hocam şurada (http://ddili.org/ders/d/foreach_opapply.html) konuyu çok güzel açıklamış; alıntılayım:
Alıntı:
'
'for' '(' ; /* 'bitmediği sürece' /; / 'başından daralt' */') {'
'auto' 'eleman =' /* 'aralığın başındaki' */;
// ... ifadeler ...
'}'
'
foreach'in kendi türlerimizle de çalışabilmesi için yukarıdaki üç özel bölümde kullanılacak olan üç özel üye işlev tanımlamak gerekir. Bu üç işlev; 'döngünün sonunu belirlemek', 'sonrakine geçmek (aralığı baş tarafından daraltmak)', ve 'en baştakine erişim' sağlamak için kullanılır.
Bu üç üye işlevin isimleri sırasıyla 'empty', 'popFront', ve 'front''tur. Derleyicinin arka planda ürettiği kod bu üye işlevleri kullanır:
> for ( ; !aralık.empty(); aralık.popFront()) {
>
> auto eleman = aralık.front();
>
> // ... ifadeler ...
> }
> ```
>
Görüleceği üzere bir döngü olma şartıyla biz bu işlevleri farklı şekillerde kullanabiliriz. Sanırım benim önceki sayfalarda while kullanmam da kuralı bozmuyor? Hatta 'retro()' işlevini kullanmadan şu şekilde de tersini alabilirdik:
void main() {
auto birAralık = Aralık(3, 7);
foreach (eleman; birAralık) eleman.write("\t");
writeln; // Düzden aralığı ekrana yansıttık...
for ( ; !birAralık.empty(); birAralık.popBack()) {
auto eleman = birAralık.back();
eleman.write("\t");
}
writeln; // Tersten aralığı ekrana yansıttık...
}
struct Aralık {
: : : // Tabi ek olarak aşağıdakileri de eklediğimizi farzetmeli...
void popBack() {
--son;
}
int back() const {
return son - 1;
}
}
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]