Thread overview
Parametrelerde 'return' anahtar sözcüğü
Mar 13, 2015
Salih Dinçer
January 16, 2015

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:

http://wiki.dlang.org/DIP25

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 14, 2015

Bu çözüm şu konuya da merhem olabilir mi?

http://ddili.org/forum/thread/1420

En azından sorunun kaynağı ilişkili :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 14, 2015

Haklısın, konunun kaynağı aynı. Farkları, burada referans döndürülüyor, diğerinde ise referans elde tutuluyor.

Bu konunun tartışmalarını tam incelemedim ama herhalde senin gibi düşünenler olmuştur. (?)

Bu arada, bu olanak gerçekleştirildi bile: git head dmd'de mevcut.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]