S leftJustify(S)(S s, size_t width, dchar fillChar = ' ') @trusted
if(isSomeString!S)
{
alias typeof(S[0]) C;
if(cast(dchar)(cast(C)fillChar) == fillChar)
{
immutable len = s.walkLength();
if(len >= width)
return s;
auto retval = new Unqual!(C)[width - len + s.length];
retval[0 .. s.length] = s[];
retval[s.length .. $] = cast(C)fillChar;
return cast(S)retval;
}
else
{
auto dstr = to!dstring(s);
if(dstr.length >= width)
return s;
auto retval = new dchar[](width);
retval[0 .. dstr.length] = dstr[];
retval[dstr.length .. $] = fillChar;
return to!S(retval);
}
}
Ben yani leftJustify bir şablon metoduyum ve S isimle bir tip üzerinde işlemler yaparım. Beni çalıştırmak istersen öncelikle bana S tipinde bir s degeri, size_t tipinde bir width değeri ve dchar tipinde bir fillChar değeri göndermek zorundasın ama senin için küçük bir kolaylık olması açısından ben fillChar değerini varsayılan olarak boşluk ayarlıyorum. Eğer sen bir fillchar değeri göndermezsen bunu kullanacağım, haberin olsun!
Alıntı:
> if(isSomeString!S) bu satırın açıklamasını Ali'ye sor!
Alıntı:
> alias typeof(S[0]) C;
Aslında ben bana gönderilen S tipinin temelde bir karakter katarı olduğunu biliyorum ve bu bilgiden faydalanarak ve katarın ilk elemanından tip bilgisini alıp bu tipin adına C diyorum.
'-> Burada bir soru S'nin bir string olduğunu biliyorsak neden açıkca string tanımlamıyoruz?'
Alıntı:
> if(cast(dchar)(cast(C)fillChar) == fillChar)
Şimdi bir sınama yapıyorum. fillChar değişkenimi önce tanımladığım C tipine sonra tekrar dchar tipine çevirip elde ettiğim değerin fillChar'a eşit olup olmadığını kontrol ediyorum.
'-> Bunu neden yaptık anlamadım. Sanırım fillChar'ın standart char olup olmadığnı test ediyoruz.'
Alıntı:
> immutable len = s.walkLength();
Eğer eşitse, kesinlikle değiştirmeyeceğimi kabul ettiğim bir len değişkeni tanımlıyor ve program çalıştığı sürece göstereceği değeri kendisine bildiriyorum. Bunu yaparken bana iletilen s değişkeninin walkLength() niteliğinden yardım alıyorum.!! Sanırım !! bu metot bana s değerimin uzunluğunu veriyor.
'-> walkLength niteliğine ulaşamadım range modülünde bir walkLength buldum ama bu daha farklı gibi nerededir bu walkLength tanımı ve ne iş yapar acaba?'
Alıntı:
> if(len >= width) return s;
Şimdi bir sınama daha yapmalıyım, eğer bana gönderilen s değerinin uzunluğu olarak bildiğim len değeri bana çalışmam için gönderilen uzunluk olan width değerinden büyükse, yani benim çalışma için belirlenen alan zaten değişkenin tamamı tarafından kapatılmışsa, bu durumda benim yapabileceğim bir iş yok, o zaman işlemi bitirip tatile çıkalım, benden sonuç bekleyenlere de bana gönderdiklerini iade edeyim :)
Alıntı:
> auto retval = new Unqual!(C)[width - len + s.length];
Off çok tembelim ama ne yapayım çok iş var. Şu retval değişkeninin tipini auto yapayımda birde onla uğraşmayayım. Bu retval ile güzel işler yapacağım en iyisi bellekte bir yer ayarlayıp onu oraya yerleştireyim hemde gözümün önünde olur :) ama bir sorun var C olarak bildirdiğim tip üzerinde ya başka işaretler varsa bana tipin saf, temiz hali gerekiyor o zaman önce şu Unqual şablon metodunu çağırıp şu tipi bir temizleyelim sonrada gerekli hesaplamayı yapıp bellekte bir yer ayarlayıp retval'a vereyim.
'-> [width - len + s.length] burada len zaten s.length ise fazladan işlem yapılmış gibi?'
Alıntı:
> retval[0 .. s.length] = s[];
Hımm. retval değişkenim hazır olduğuna göre şimdi bana gönderilen karakter katarını bu değişkene aktarayım. D'nin kestirme yollarını seviyorum [] işleci sayesinde dizinin tamamını tek bir hamlede aktarabildim.
Alıntı:
> retval[s.length .. $] = cast(C)fillChar;
return cast(S)retval;
Şimdi ise retval değişkeninin geriye kalan kısmını doldurayım. Evet artık hazır son olarak retval'ı gelen tipe çevirip geri göndereyim.
'-> Burada Unqual ile yapılan temizleme işlemini tam anlamadığım için bu kısımda askıda kaldı ?'
Metodun kendisini tanıttığı tarzda bir yazı hazırlamaya çalıştım, tabi ki amacım D bilgim ile böyle bir metodu anlamaya çalışmaktı. Başlangıçta keyifli ve basit bir iş gibi görünsede ilerleyen satırlarda ve başka metodlara dallandıkça çok zor ve emek isteyen bir iş olduğunu anladım. Bu sebeple else kısmını atladım :) Hikayeye devam etmek isteyenler tamamlayabilir.
Diğer taraftan böyle bir çalışmanın ne kadar öğretici olduğunuda anlama fırsatı buldum. immutable, Unqual, [] gibi daha önce geçmiş tarimleri tekrar hatırladım walkLength gibi yeni niteliklerle tanıştım. Değişik bir tarz olduğunu söylemeliyim belki bir toplulukla daha etkileyici bir deneyim olabilir.
Sorular alttaki mor satırlarda, eksik ve yanlışlarımıda düzeltirseniz memnun olurum.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]