Alıntı (zafer):
> aşağıdaki satırını tam çözemedim.
> xml.onStartTag["book"] = (ElementParser xml)
> ```
>
Çünkü aşağıda gelen kod bloğu da bu ifadenin bir parçası (noktalı virgül ta onu kapatan küme parantezinden sonra). Sağ tarafta aslında bir delegate var.
Her ne kadar 'function' anahtar sözcüğü kullanılmadığı için sağ taraftaki bir 'delegate' olsa da, çok kolay olarak şöyle tanımlayabiliriz: Sağ tarafta isimsiz bir işlev var.
Yaptıkları, "book" dizgisi ile sağ taraftaki delegate'i eşleştirmek. Daha sonradan bu eşleme tablosunda "book"u aradıklarında bu delegate'i bulacaklar ve işletecekler.
Alıntı:
> ElemenParser nedir?
O kütüphanenin bir türü o. Kütüphanenin söylediği şu: eğer bize ElementParser alan bir delegate verirseniz, biz de dosyayı tararken o string ile karşılaşırsak sizin tanımlamış olduğunuz o delegate'i bir ElementParser ile çağıracağız. Siz de o ElementParser'ı istediğiniz gibi kullanırsınız.
http://ddili.org/ders/d/kapamalar.html
(Not: Oradaki "kapama"ları sonradan "temsilci" olarak değiştireceğim.)
Ben daha basit olarak şöyle bir programla açıklamaya çalıştım:
import std.stdio;
import std.conv;
int main(string parametreler[])
{
if (parametreler.length < 4) {
stderr.writefln(
"HATA: Parametre olarak en az iki sayı ve bir veya daha fazla\n"
" işlem ismi vermeniz gerekiyor. Örnek:\n\n"
" %s 42 100 topla çıkart topla topla\n", parametreler[0]);
return 1;
}
/* Programın kendi isminden kurtuluyoruz */
parametreler = parametreler[1 .. $];
/*
* İki tane int parametre alan ve int döndüren delegate türüne önce
* kullanışlı bir isim verelim. Bundan sonra İşlemci dediğimizde bu tür
* yerine geçecek.
*/
alias int delegate(int, int) İşlemci;
/*
* Şimdi dizgiden İşlemciye dönüşüm yapan bir eşleme tablomuz var.
*/
İşlemci[string] işlemciler;
/*
* Bu tablo içinde "topla" indeksine (anahtarına) karşılık olarak bu
* delegate bulunacak.
*/
işlemciler["topla"] = (int soldaki, int sağdaki) {
return soldaki + sağdaki;
};
/*
* Aynı biçimde, "çıkart" yerine de bu delegate.
*/
işlemciler["çıkart"] = (int soldaki, int sağdaki) {
return soldaki - sağdaki;
};
/*
* Komut satırından gelen parametreleri kullanalım
*/
immutable int birinci = to!int(parametreler[0]);
immutable int ikinci = to!int(parametreler[1]);
/* Sayılardan da kurtuluyoruz */
parametreler = parametreler[2 .. $];
writefln("sayılar: %s ve %s", birinci, ikinci);
foreach (işlem_ismi; parametreler) {
if (işlem_ismi in işlemciler) {
auto işlemci = işlemciler[işlem_ismi];
writefln("işlem: %s, sonuç: %s",
işlem_ismi, işlemci(birinci, ikinci));
} else {
writefln("\"%s\" işlemini bilmiyorum", işlem_ismi);
}
}
return 0;
}
O programda 'auto' kullandığım yerde İşlemci de yazabilirdim. Hatta iyice açık olarak şunu da:
int delegate(int, int) işlemci = işlemciler[işlem_ismi];
O tür, 'işlemci'nin *iki tane int parametre alan ve int döndüren bir delegate* olduğunu söylüyor.
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]