Tekrar Merhaba,
Gereksiz Bilgiler Serisi'nin bu 2. bölümünde aşağıdaki uyduruk yapımızı yaptık. Hani "deveye hendek atlatmak şeklinde bir deyiş vardır! İşte string'e çit atlatınca Çitring oldu :)
Biliyorsunuz string türü çok akıllı! İçinde hem dar string (ASCII) hem dchar barındırarak UTF8'den itibaren her türlü karakteri taşıyor. Ancak daha kişilleştirilmiş deli bir şeye ihtiyacınız var diyelim...
Evet, aşağıdaki Çitring (!) biraz kafa karıştırıcı olabilir ama alias ile her şey daha basit oluyor. Elbette daha da basit yazılabilirdi. Sadece birçok olanağı kullanmak istedim:
struct Çitring (T, size_t boyut) {
private T[boyut] harfler;
private size_t indeks;
this(S) (S str) {
foreach(s; str.stride(1)) {
harfler[indeks++]= cast(T)s;
}
}
@property length () { return indeks; }
@property capacity () { return boyut; }
@property usefulCapacity () {
return boyut - indeks;
}
ref opIndex (size_t harf) {
return harfler[harf];
}
auto opSlice (size_t x, size_t y) {
return harfler[x..y];
}
}
NOT: mısralar[11] dizisi ilk bölümümüzde. Kodu denemek isterseniz buradan kopyalamalısınız ya da 37 karakteri aşmayan kendi cümleleriniz ile deneyin...
void main() {
alias MISRA = Çitring!(dchar, 37);
MISRA[] çitring = [ MISRA(mısralar[0]),
MISRA(mısralar[1])
];
mısralar[2].length.writeln; // 40!
/* Aslında yapı kurucusunda boyut
* kontrolü olmalı! (-bknz:
* Sözleşmeli Programlama)
*/
çitring[0][0..6].writeln; // korkma
çitring[1][8..16].writeln; // yurdumun
çitring ~= MISRA(mısralar[2]);
çitring[$-1][16..23].writeln("!"); // yıldızı
çitring[$-1].usefulCapacity.writeln; // Kalan: 1
}
Çıktısı basit, alt alta "korkma yurdumun yıldızı!" yazıyor. Elbette bunu string dizisi ile de yapabilirdik ama mesela bu dizinin 3. elemanı (mısrası) kaç harften oluşuyor dediğimde bana 36 yerine 40 sayısını veriyor. İşte o yüzden elemanlarına stride() ile erişiyoruz ya!
Neyse, fazla lafa gerek yok. Gereksiz bir container yapıda zaten pekçok şey var. Siz de belki pratik yapmak için opDollar(), opAssign() gibi yüklemeleri de yapabilirsiniz.
Kolay gelsin...