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. ]