December 31, 2009

http://www.digitalmars.com/d/2.0/changelog.html#new2_038

Benim ilginç bulduğum iki tanesi:

  • Kurucu işlevi tanımlanmış olan yapı nesneleri artık '{ }' yazımıyla kurulamıyorlar. Dersleri düzeltmek gerek... ;)

  • 'auto ref' işlevler:

http://www.digitalmars.com/d/2.0/function.html#auto-ref-functions

Eğer döndürdüğü değer bir sol değer (lvalue) ise, onu referans olarak döndürüyor; değilse değer olarak. Normalde kopyalayarak döndüreceğine, referans olarak:

auto ref foo(ref int x)
{
   return x; // referans olarak, x'in kopyası olarak değil
}

Aslında kurallar bayağı karışık; ben henüz yararını anlamadım...

Bu arada o başlığın öncesinde ve sonrasında başka işlev türleri de var: 'ref', 'auto', 'inout'...

'inout' ilginç: O sayfada gösterilen üç işlev yerine tek bir işlev yazabiliyoruz. Dönüşün türünü, döndürülen parametreden otomatik olarak anlıyor:

          int[] foo(           int[] a, int x, int y) { return a[x .. y]; }
   const(int)[] foo(    const(int)[] a, int x, int y) { return a[x .. y]; }
immutable(int)[] foo(immutable(int)[] a, int x, int y) { return a[x .. y]; }

Yukarıdaki üç işlev için derlenen kodlar tamamem aynı. Tek fark, erişim hakları. Artık tek bir işlev yazılabiliyor:

inout(int)[] foo(inout(int)[] a, int x, int y) { return a[x .. y]; }

Orada 'inout', "döndürdüğüm parametrenin erişim hakkı ne ise" anlamına geliyor, ve döndürülen değere göre otomatik olarak 'const', 'immutable', veya değişken olabiliyor.

Ali

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