Forum: D Programlama Dili RSS
const mı immutable mı?
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: const mı immutable mı?
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
Avatar
esatarslan52 (Moderatör) #2
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
immutable ile const arasındaki farkı pek anlayamamıştım.

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

"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.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 17:22:04 (UTC -08:00)