September 09, 2009

Başlıkta yazdığım gibi scope ne işe yarar nasıl kullanılır ?

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

September 10, 2009

D'de normalde nesneler çöp toplayıcı tarafından ve ilerideki belirsiz bir zamanda sonlandırılırlar. scope, "bu nesneyi bu kapsamdan çıkarken" sonlandır demektir. (C++'da olduğu gibi.)

scope kullanmayan bir program:

import std.stdio;

class Öğrenci
{
   this()
   {
       writeln("Öğrenci kuruldu");
   }

   ~this()
   {
       writeln("Öğrenci sonlandırıldı");
   }
}

void foo()
{
   for (uint i = 0; i != 3; ++i) {
      auto öğrenci = new Öğrenci;
   }
}

void main()
{
   writeln("foo'yu çağırıyorum");
   foo();
   writeln("foo'dan dönüldü");
}

ve çıktısı:

'foo'yu çağırıyorum
Öğrenci kuruldu
Öğrenci kuruldu
Öğrenci kuruldu
foo'dan dönüldü
Öğrenci sonlandırıldı
Öğrenci sonlandırıldı
Öğrenci sonlandırıldı
'

Yani sonlandırma işlemi, çöp toplayıcı tarafından en sona bırakılmıştır. Bazen bunu istemeyiz: örneğin bir dosya nesnesinin dosyayı kapatması gerekir...

İşte bunun için, eğer o programda 'öğrenci''nin tanımına 'scope' eklenirse:

scope auto öğrenci = new Öğrenci;

artık çıktısı şöyle olur:

'foo'yu çağırıyorum
Öğrenci kuruldu
Öğrenci sonlandırıldı
Öğrenci kuruldu
Öğrenci sonlandırıldı
Öğrenci kuruldu
Öğrenci sonlandırıldı
foo'dan dönüldü
'

Yani artık nesne C++'da olduğu gibi, for döngüsünün kapsamı sonunda sonlandırılmaktadır.

Bazen de bir türün bütün nesnelerinin böyle kapsam sonunda sonlandırılması istenir. (Örneğin Dosya gibi bir tür...) O zaman da 'scope' sınıf tanımına eklenir:

scope class Öğrenci
{
   // ...

Öyle yapınca, 'öğrenci' tanımının da 'scope' olması şart koşulur.

Ali

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