Thread overview
Global degişkenler
Jul 17, 2009
erdem
Aug 20, 2012
Salih Dinçer
Aug 21, 2012
Salih Dinçer
July 17, 2009

import std.stdio;

class Dünya
{
   this ()
   {
       writeln ("Merhaba Dünya");
   }

   ~this ()
   {
       writeln ("Güle Güle");
   }
}

Dünya dünya = new Dünya ();

/+
static this ()
{
   Dünya dünya = new Dünya();
}
+/

void main ()
{
}

D'de oluşturduğumuz bir sınıfa ait bir nesneyi global olarak belirleyemiyormuyuz? Yukardaki kod kısmında alıntı kısmını değil de alıştığımız yöntemle global bir dünya nesnesi oluşturmaya çalıştığımda şöyle bir hata alıyorum.

Alıntı:

>

dmd -w dünya.d
'Error: non-constant expression new Dünya['

Bir de burada neden ''static this ()'' kullandığımız anlayamadım. Sanki namespace'de olduğu gibi yeni bir kapsam oluşturuyormuşuz gibi geldi.

Not: Forumun kod renklendirme özelliği güzelmiş. Ama kod numaraları olmasa bence daha güzel olurdu.

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

July 17, 2009

Böyle güzel sorulara devam! :) Ben daha düzenli bir şekilde öğrenmeye başlayamadım. Bu sorular sayesinde çok şey öğreniyorum... :)

D dilinde çöp toplayıcının nesneleri sonlandıracağı garanti değilmiş:

http://www.digitalmars.com/d/2.0/class.html#destructors

Eğer mutlaka sonlanmasını istiyorsak açıkça 'delete''i çağırmak gerekiyormuş. O zaman çöp toplayıcı nesneyi beklendiği gibi hemen sonlandırıyormuş.

Yukarıdaki sayfadan iki nokta:

  • Önemli: Çöp toplayıcıya bırakılan nesnelerin bozucuları birbirlerinin üyelerini kullanamıyorlar; çünkü çöp toplayıcının hangi nesneyi hangi sırada sonlandırdığı belli değil.

  • Data segment'ten referans edilen nesneler çöp toplayıcı tarafından sonlandırılmıyorlar.

'static this', içinde tanımlanan globalleri ilklemek için kullanılıyor. Böylece arada kurmak için gereken başka işlemler de yapılabiliyor. Yani aslında bir fonksiyon gibi. Yoksa global kapsamda ifadeler kullnamıyoruz ya...

Gösterdiğin kodda yalnızca 'dünya''yı ilklemen yeterli; başına bir daha 'Dünya' yazmak doğru olmuyor:

import std.stdio;

class Sınıf
{
   int değer_;

   this(int değer)
   {
       değer_ = değer;
       writeln("Sınıf");
   }

   ~this()
   {
       writeln(değer_, " değerli ~Sınıf");
   }
};

/* Burada daha ilklenmiyor; çünkü kurucu parametresini
* vermiyoruz zaten: */
Sınıf nesne;

static this()
{
   /* Asıl ilkleme burada oluyor */
   nesne = new Sınıf(42);
}

void main()
{
   /* Mutlaka sonlanması gerekiyorsa: */
   delete nesne;
}

Ali

Not 1: Renkli kod konusunda haklısın: güzel ama ekrandan kopyalarken numaralar da geliyor. :( Kod renklendirmesi kullandığımız forum programının bir olanağı; eminim onlar da standart bir şey kullanıyorlardır. Numaraları kaldırmak mümkün olmalı; ama sonra... ;)

Not 2: Acaba destructor'a sonlandırıcı demeye başlasa{m|k}? Hep bozucu diyorum ama artık sevmemeye başladım. :/

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

August 21, 2012

Eski bir konuyu hortlattım, kusura bakmayın...:)

Her ne kadar programcılıkta bunlardan kaçınılması öneriliyorsa da, acaba GC yönünden main() dışında immutable veya enum kullanmak bir "Global Variable" mıdır? Bazı şeyleri "macro" gibi düşünemez miyiz?

Yoksa GV'lerden kaçınmak için her şeyi bir sınıf içinde oluşturup, onların da paylaşılması gereken üyelerini bir şekilde "interface" gibi olanaklara bağlayıp mı kullanmalı. Amacım modern ile geleneksel yöntemler arasında bir orta yol bulmak...

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

August 21, 2012

Evet, beklendiği gibi...

Alıntı:

>

main.d(6): Error: module boyacii from file boyaci.d conflicts with another module boyacii from file boyaci.d

İnanmadığım için değil tabi...:)

Sadece bir kaç şeyi denemek istedim. Örneğin main() dışındaki Ali dizgesini şöyle başındaki nokta ile ekrana yazdım:

Ali.writeln();

Sonuç noktasız haliyle aynıydı. Bu nokta olayını da Ali hocam İstanbul buluşmamızda göstermişti. Sonra yanına boyaci modülünün ismini koydum ve beklediğim gibi orada tanımladığım dizgenin karşılığını verdi. Ancak bir şey daha denedim:

Önce module boyaci; satırını gizledim ve kod aynı şekilde derlendi. Demek ki varsayılan olarak modül ismi dosya ismi ile aynı oluyor olmalı, öyle değil mi?

Sonra emin olmak için sonuna bir i daha koyduğumda yukarıda verdiğim hatayı aldım. Her şey yolunda ve düzgün işliyor.

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

August 21, 2012

Dediğin gibi, enum veya immutable durumunda hiçbir sakınca yok. Anlaşılan onlar bir modülün sunduğu sabit değerler.

Bu arada, D'de C'deki anlamında global değişken olmadığını da hatırlatmak isterim. Her değişken en dış olarak modül düzeyinde tanımlanabiliyor. a ve b modüllerinin aynı 'x' adıyla tanımladıkları global değişken çakışsalar bile birisine A.x, ikisine B.x denerek sorundan kurtulunuyor.

Global değişkenlerin başka bir sorunu da D'de bulunmuyor: C ve C++ gibi başka bir sürü dilde eş zamanlı programlamada global değişkenler bütün iş parçacıkları tarafından görülebilir. D'de ise varsayılan olarak "thread-local" oluyorlar. Her iş parçacıkları birbirlerininkini değiştiremiyorlar.

Ali

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