scope anahtar sözcüğünün bu kullanımına derslerde değinmeyi unutmuşum. :) Az önce tekrar keşfettim.
scope'un bildiğimiz anlamı, "bu nesneyi bu kapsamdan çıkarken sonlandır" demekti:
class Sınıf
{}
void main()
{
foreach (i; 0 .. 10) {
scope değişken = new Sınıf;
} // <-- nesne, tam bu noktada sonlandırılır
}
Yukarıda 'scope' yazıldığı için nesne hemen kapsam sonunda sonlandırılır. Yazılmasa, çöp toplayıcı tarafından ilerideki belirsiz bir zamanda sonlandırılır.
Burada ondan söz etmiyorum. scope'un başkaca üç kullanımı daha varmış:
- scope(exit): bu kapsamdan çıkılırken işlet
- scope(success): bu kapsamdan başarıyla çıkılırken işlet
- scope(failure): bu kapsamdan hata ile çıkılırken işlet
import std.stdio;
void hataAtabilen(int i)
{
if (i == 2) {
throw new Exception("hatalı bir durum");
}
}
void main()
{
foreach (i; 0 .. 10) {
scope(exit) writeln("çıkılırken işletilen");
scope(success) writeln("başarılıyken işletilen");
scope(failure) writeln("hata durumunda işletilen");
writeln("i: ", i);
hataAtabilen(i);
}
}
Çıktısı şöyle:
i: 0
başarılıyken işletilen
çıkılırken işletilen
i: 1
başarılıyken işletilen
çıkılırken işletilen
i: 2
hata durumunda işletilen
çıkılırken işletilen
object.Exception: hatalı bir durum
Mantıklı olarak, scope ifadeleri tanımlandıkları sıranın tersinde işletiliyorlar. (Bunun nedeni, daha aşağıdaki bir scope ifadesinin daha üstteki bir nesneyi kullanıyor olabilmesidir. Temizlik işlevleri ters sırada işletilirlerse, böyle bağımlı kodlar her zaman için doğru çalışır; yoksa, daha aşağıdaki ifadeler sonlanmış nesnelere erişmeye çalışabilirlerdi. Aynı nedenden, bozucu işlevler de ters sırada işletilirler.)
D'deki çoğu olanakta olduğu gibi, scope'lar da blok halinde tanımlanabiliyorlar:
scope(exit) {
writeln("çıkılırken işletilen");
writeln("çıkılırken ayrıca işletilen");
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply