Bu konuyu da HTML'in gibi başlık elemanları ile üzerinde konuşacağım. Elimizde bu işe yarayan bir işlev var:
string başlık(int düzey, string metin)
{
string etiket = 'h' ~ to!string(düzey);
return '<' ~ etiket ~ '>' ~ metin ~ "</" ~ etiket ~ '>';
}
unittest
{
assert(başlık(1, "merhaba") == "<h1>merhaba</h1>");
}
Birim testindeki kullanımdan anlaşıldığı gibi verilen dizgiyi başlık etiketi haline dönüştürüyor. Güzel ama bunda bir yetersizlik var: ya başlık elemanının içinde ile kalın yazı da kullanmak istesek? Örnek: "merhaba dünya".
İşlevin bu tasarımı pek kullanışlı değil, çünkü önce "merhaba dünya" dizgisini oluşturmamız gerekiyor. Ancak ondan sonra işleve verebiliyoruz:
string koyu(string metin)
{
return "<b>" ~ metin ~ "</b>";
}
// ...
string başlıkSatırı = başlık(1, "merhaba " ~ koyu("dünya"));
string'in ~ işleci olduğu için burada yararı tam olarak anlaşılmıyor ama burada D'nin belirsiz sayıda parametre olanağından yararlanabiliriz. Örneğin başlık()'ı şöyle çağırmak yararlı olur (string yerine başka bir yapı türü olsaydı daha iyi anlaşılırdı).
Bu iş D'de çok kolay:
-
Son parametreyi o türden dizi alacak şekilde değiştirin: yani string yerine string[]
-
Ondan sonra '...' yazın
-
Gereken veriyi, o dizide foreach ile ilerleyerek oluşturun
string başlık(int düzey, string[] metinParçaları ...)
{
string etiket = 'h' ~ to!string(düzey);
string metin;
foreach (parça; metinParçaları) {
metin ~= parça;
}
return '<' ~ etiket ~ '>' ~ metin ~ "</" ~ etiket ~ '>';
}
unittest
{
assert(başlık(1, "merhaba") == "<h1>merhaba</h1>");
assert(başlık(2, "merhaba ", koyu("dünya"))
== "<h2>merhaba <b>dünya</b></h2>");
}
Birim testindeki ikinci assert'te görüldüğü gibi, sondaki parametreler string oldukları sürece başlık()'ı istediğimiz kadar parametre ile çağırabiliyoruz.
Dikkat ederseniz, oradak koyu çağrısından önce ~ işleci değil virgül var. Dediğim gibi, string olmayan türlerde bunun yararı daha iyi anlaşılıyor. Eğer bu olanak olmasaydı ve başlık() tek bir string alacak şekilde yazılmış olsaydı, birden fazla HtmlElemanı türünü şöyle kullanmak zorunda kalırdık (bunları derlemeden yazıyorum):
// Bu sefer HtmlElemanı diye bir tür olduğunu ve onun nesnelerini
// kullandığımızı varsayalım
başlık(3, to!string(metinElemanı("merhaba ")) ~
to!string(koyuElemanı("dünya")) ~
to!string(eğikElemanı(" ve evren")));
Veya text'ten de yararlanabilirdik:
başlık(4, text(metinElemanı("merhaba "),
koyuElemanı("dünya"),
eğikElemanı(" ve evren")));
Aslında sonuncusu da güzelmiş ve yeterliymiş. :D
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply