Thread overview
immutable(char)[] ile immutable char[] Dizgesinin Farkı
July 08, 2010

Bu farkı ilk önce örnek vererek anlatacağım:

import std.stdio;
void main(){
   immutable char[] str = "Bir";
   str[0] = 'X' ; //Derleyici hata verir.
   str= "İki"; //Derleyici hata verir.
}

Bu örnekteki immutable bir tür niteleyicisi. Ve burada immutable char[] türünü niteliyor. Ve bu char[] türündeki değişenin değişmeyeceğini char[] yerine kullanılamayacağını belirtiyor. Ancak biz bunu şu şekilde tanımlar isek:

import std.stdio;
void main(){
   str[0] = 'X' ; //Derleyici hata verir.
   immutable (char)[] str = "Bir";

   str= "İki"; //Derleyici hata vermez. Çünkü str değişkeni yeniden inşa edildi.
}

Hata vermeden çalışacaktır. Çünkü burada immutable char[] türünü nitelemiyor. sadece char türünü niteliyor. Ve bu nitelenen türden yeni bir dizi yapıyor. Bu dizinin her bir elemanı immutable özelliğine sahip. Yani elemanlarını değiştirmeye çalışırsanız iki örnektede hata verecektir. Ancak İkinci örnekte str değişkenini elemanını değilde tamamını değiştirirseniz hata vermez.

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

July 08, 2010

String tanımlandığında da son örnekteki gibi kod örneği hata vermiyor:

void main(){
   string str = "Bir";
   str= "İki"; //Derleyici hata vermez.
}

Bu durumda string derslerde gösterildiği gibi immutable char[] değil gerçekte immutable (char)[]' belirtiminin takma adıdır.

Not : immutable char[] ile immutable(char[]) aynıdır.

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

July 08, 2010

Açıklama için teşekkürler. :)

Yani 'immutable (char)[]', değişmez karakterlerden oluşan ama kendisi değişebilen dizi.

'immutable char[]' ise, değişmez bir dizi. Ama burada ek bir şey daha var: D'de tür niteleyicileri derine doğru dallanıyor. O yüzden aslında o da 'immutable immutable(char)[]' ile aynı şey.

Bunu görmek için şöyle bir deney yaptım:

void main()
{
   immutable(char)[] dizgi0;

   immutable char[] dizgi1;
   immutable immutable(char)[] dizgi2;   // üsttekiyle aynı

   assert(typeid(dizgi0) != typeid(dizgi1));
   assert(typeid(dizgi1) == typeid(dizgi2));
}

'typeid' türün kimliğidir. İkinci 'assert''e bakılırsa dizgi1 ve dizgi2'nin türleri aynı...

Ali

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