Merhaba,
Türkçe değerlendirmeyi kod içinde açıkladım ve orijinali azıcık değiştirdim. Bu bir derlenen ve hatasız çalışıp sonlanan koddur. Yani ne görüyorsanız o :)
Eğer referans döndüren ilkEleman() işlevinin başına sadece auto konursa ya da ref başına // işaretini koyun (toggle comments) son satır hata verecektir.
/* Referans türü olmayan bir S yapımız var ve içinde i
* Bir de içeriğini bir arttıran inc() işlevi var
* Bu yapı, dizinin ilk elemanına 1 değeri ile kurulur
* Sonra ilk elemanı yani yapının referansını front() ile
* döndürüp kendi olanağı ile bir arttırılır...
* Daha sonra, 2. bölümde benzer işlem yerel bir değişken
* üzerinden yapılır ve bir arttırılır...
* Umulur ki referansı olsun ama içerği 3'e yükselmesine
* rağmen aynı nesne değildir
* Bunu sondaki 3. bölümde görüyoruz ve derlemeye gerek
* olmadan (çünkü kod hatasız çalışır) anlıyoruz..
*/
struct S {
int i;
void inc() {
++i;
}
}
alias front = ilkEleman;
ref R/*
auto//*/
ilkEleman(R)(R[] arr) {
return arr[0];
}
void main() {
auto arr = [ S(1) ];
// Tamam, bu işlem arr[0] arttırır (¹)
arr.front.inc();
assert(arr[0].i == 2);
// Bu, yerel değişkeni arttırır (²)
auto umulurkiRef = arr.front;
umulurkiRef.inc();
assert(umulurkiRef.i == 3);
// Ama, dizinin içeriği hala 2! (³)
assert(arr[0].i == 2);
}
Haa, hazır auto yapmışken dizi içindeki S(1)'i new işleçini kullanın. Böylece lvalue haline dönecek. Sakın yıldız kullanmayın, zaten D sizin için çevirecek ama sondaki assert() satırı yine hata verecek. Muhtemelen class ile de aynı olacaktır.
Konu şuradan refere: https://forum.dlang.org/post/tttd9u$1mhn$1@digitalmars.com
Kolay gelsin...