Referans parametrelerini döndüren işlevler tanımsız davranışa neden olabilirler. Aşağıdaki işlev parametrelerinden küçük olanına referans döndürüyor. O sayede dönüş değerine atayabiliyoruz.
/*
* min()'in Türkçesi
*
* Notlar:
*
* 1) Bunun şablon olması çok daha uygundur
*
* 2) Normalde tek satır olarak yazılır:
*
* return sağdaki < soldaki ? sağdaki : soldaki;
*/
ref int küçüğü(ref int soldaki, ref int sağdaki)
{
if (sağdaki < soldaki) {
return sağdaki;
} else {
return soldaki;
}
}
unittest
{
int i = 10;
int j = 20;
küçüğü(i, j) = 42; // <-- Dönüş değerine atama
assert(i == 42);
assert(j == 20);
}
void main()
{}
Yani, ref döndürebilmek güzel. Ancak, parametrenin ömrü döndürülen ref'ten daha kısaysa tanımsız davranışla karşı karşıyayız demektir. D'de şimdilik aşağıdaki hatayı giderecek olanaklar bulunmuyor:
import std.stdio;
ref int foo(ref int i)
{
// Örnek kısa olsun diye hemen döndürüyoruz
return i;
}
ref int bar(int i)
{
return foo(i); // <-- HATA: bar'in parametresi kısa ömürlüdür
}
void main()
{
int i = 42;
int * p = &(bar(i)); // p, sonlanmış bir parametre değerini göstermektedir
writeln("merhaba dünya"); // İlgisiz bir çağrı
writeln(*p); // Bakalım elimizde ne var?
}
Tanımsız değer, karşımıza çöp değer olarak çıkabilir:
'
merhaba dünya
4389664 <-- Bu ne? :)
'
Kısa ömürlü değişkenlerin onlardan daha uzun ömürlü referanslar tarafından gösterilmelerini önlemek için derleyicinin bizden yardım alması gerekiyor. 2.067'de 'return' anahtar sözcüğü "bu parametre referans olarak döndürülebilir" anlamında kullanılabilecek:
ref int foo(return ref int i) // <-- 'return' parametre
{
// ...
}
ref int bar(return int i) // <-- 'return' parametre
{
// ...
}
Konunun ayrıntısı şurada:
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]