Alıntı (zafer):
> Halen tam olarak anladığımıda söyleyemem, halen inceliyorum.
Çok normal. Neden temsilci kullanacağımıza işlevi doğrudan çağırmıyoruz diye düşünülebiliyor.
Bir programcı bir işlev yazmış ama bir bölümünü bilmiyor. Onu parametre olarak bize bırakıyor. Biz de sonradan o bölümünü isimsiz işlev veya temsilci olarak veriyoruz.
Alıntı:
> Ancak function yerine delegate yazınca olmuyor. Dersanede böyle çalışabileceği yazıyordu.
Sorun ne sende ne bende. :) Aslında temsilci denen dil olanağı bir çok iş başarıyor. Ben bunların çok işe yaradıklarını düşündüğüm bölümünü anlatmaya çalışmıştım. Tabii o bölümü yazmaya başladığım zaman hepsini ben de bilmiyordum. Tam olarak yerini söylersen hiç olmazsa bu yanlış anlamayı gidermeye çalışırım. Bu durumda soldaki sözlükte söylediğim doğru galiba: "temsilci: [delegate], oluşturulduğu ortamdaki değişkenlere erişebilen isimsiz işlev". Yani elimizde bir isimsiz işlev olduğu sürece doğru söylemişim. (Galiba. :))
Asıl kaynaklar şurada "Delegates, Function Pointers, and Closures" başlığı altında:
http://dlang.org/function.html
Ve şurada:
http://dlang.org/expression.html#FunctionLiteral
Birinci bağlantıya bakılırsa atladığım bilgiler şöyle:
İkinci bağlantı ise benim odaklandığım noktayı içeriyor: İsimsiz işlevlerin temsilci olmaları...
Alıntı:
>
> // Burada function yerine delegate yazınca olmuyor ?
> int function(int, int) gosterge;
>
> gosterge = &Topla;
> ```
>
Onun nedeni, değer olarak kullandığın &Topla'nın bir işlev göstergesi olması. Yani tam bir function. Değer olarak bir isimsiz işlev kullansan olur:
int delegate(int, int) gosterge;
gosterge = (a, b) { return Topla(a, b); }; // Olur
gosterge = (a, b) => Topla(a, b); // Olur
writefln("Topla : %s", gosterge(3, 5));
gosterge = (a, b) { return Carp(a, b); }; // Olur
gosterge = (a, b) => Carp(a, b); // Olur
writefln("Carp : %s", gosterge(3, 5));
Ama senin düştüğün gibi durumlarda yardımcı olmak için std.functional.toDelegate de var:
import std.functional;
// ...
int delegate(int, int) gosterge;
gosterge = toDelegate(&Topla);
writefln("Topla : %s", gosterge(3, 5));
gosterge = toDelegate(&Carp);
writefln("Carp : %s", gosterge(3, 5));
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]