Thread overview
const mı immutable mı?
Oct 05, 2009
esatarslan52
October 04, 2009

trileri'nin tr.string modülünü gerçeklerken Can'a fonksiyonları "şimdilik dstring olarak" yazmasını, diğer türleri sonra düşeneceğimizi söylemiştik. O da sağolsun öyle yapmıştı... Ben ise bu konuyu düşünmeyi bugüne kadar erteledim... :)

Bir örnek:

dstring toupper_tr(dstring dizgi)

dstring, 'immutable (dchar)[]' türünün bir takma adı (alias)... O yüzden 'toupper_tr' örneğin bir 'dchar[]' ile çağrılamıyor. Tabii aynı konu string, wstring, ve diğer bütün türlerle de var. Konu, değiştirmeyeceğimiz parametrelerin immutable mı yoksa const mı olması gerektiği...

Hızlıca bir örnek olarak:

char ilkHarfi(string dizgi)
{
   return dizgi[0];
}
import std.stdio;

void main()
{
   string değişMEZ = "abc";
   writeln(ilkHarfi(değişMEZ));

   char[] değişir;
   değişir ~= "abc";

   // DERLEME HATASI:
//     writeln(ilkHarfi(değişir));
}

Ben "şimdilik dstring" derken, C++'dan bildiğim bir kuralla hareket etmiştim. C++'da kodun doğru çalışması için, olabilen hemen her yere 'const' yazılır. Böylece kodun const'lığı doğru olur; İngilizce karşılığıyla, kod const-correct olur.

immutable'ın da const'tan daha sağlamcı olduğunu bildiğim için, her yere 'immutable' koymanın doğru olacağını düşünmüştüm. Yanılmışım... :)

immutable'ın const'tan daha sağlamcı olduğu doğru... Ama işlev parametrelerinde, kullanıcıyı gereksiz bir yükümlülük altına sokuyor: immutable, "bana kesinlikle değişmeyecek olan bir dizgi ver" anlamına geliyor.

Oysa söylemek istediğimiz, C++'da da olduğu gibi, "bana ne tür dizgi verirsen ver, ben onu değiştirmeyeceğim". O yüzden de işlevleri yazarken aksine bir neden yoksa, parametreleri 'const' olarak seçmeliyiz.

Buna göre, yukarıdaki örnek şöyle değişir, ve artık derlenir :):

char ilkHarfi(const char[] dizgi)
{
   return dizgi[0];
}

Ali

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

October 05, 2009

immutable ile const arasındaki farkı pek anlayamamıştım.

Alıntı:

>

"bana kesinlikle değişmeyecek olan bir dizgi ver"

Alıntı:

>

"bana ne tür dizgi verirsen ver, ben onu değiştirmeyeceğim"

Bunlar biraz daha kafamda ikisi arasındaki farkı anlaşılır hala getirdi.

Merak ettiğim konu neden D'de stringleri immutable yapma ihtiyacı duymuşlar :huh: ?C++ da immutable değiller.

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

October 05, 2009

'immutable' tam bir garanti de sağlamıyor: onu da normale çevirmek mümkün:

void main()
{
   string s = "abc";

   char[] değişen = cast(char[])s;
   değişen[0] = 'z';
}

Öyle bir şey yapıldığında programın davranışı tanımsızdır: benim ortamımda 'segmentation fault' ile göçüyor; başka ortamda çalışabilir de...

Ama bu durumun C++'dan bir farkı yok. C++'da da aslında dizgi hazır değerleri const'tır:

int main()
{
   char * s = "abc";
   s[0] = 'z';     // <-- tanimsiz davranis
}

gcc ile Linux ortamında yine 'segmentation fault'...

Eğer arkasından numara çevrilmese, immutable örneğin hız kazancı sağlayabiliyor: thread'lerin bu veri için güvenlik sağlamaları gerekmiyor; çünkü biri okurken diğeri değiştiremiyor.

Ali

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