auto
ve typeof
auto
Bazen aynı ismin iki veya daha fazla modülde birden tanımlı olduğu durumlarla karşılaşılabilir. Örneğin birbirlerinden farklı iki kütüphanenin iki modülünde de File
isminde bir tür bulunabilir. O ismi tanımlayan iki modülün birden eklenmesi durumunda da yalnızca File
yazmak karışıklığa neden olur; derleyici hangi türün kullanılacağını bilemez.
Böyle durumlarda hangi modüldeki ismin kastedildiğini belirtmek için modülün ismini de yazmak gerekir. Örneğin File
türü ile ilgili böyle bir isim çakışması olduğunu varsayarsak:
std.stdio.File dosya = std.stdio.File("ogrenci_bilgisi", "r");
O kullanımda uzun ismin hem de iki kere yazılması gerekmiştir: sol tarafta dosya
nesnesinin türünü belirtmek için, sağ tarafta ise File
nesnesini kurmak için.
Oysa derleyiciler çoğu durumda sol tarafın türünü sağ tarafın türüne bakarak anlayabilirler. Örneğin 42 gibi bir tamsayı değerle ilklenen bir değişkenin int
olduğu, veya std.stdio.File
kurularak oluşturulan bir nesnenin yine std.stdio.File
türünden olduğu kolayca anlaşılabilir.
D'nin auto
anahtar sözcüğü, sol tarafın türünün sağ taraftan anlaşılabildiği durumlarda sol tarafın yazımını kolaylaştırmak için kullanılır:
auto dosya = std.stdio.File("ogrenci_bilgisi", "r");
auto
'yu her türle kullanabilirsiniz:
auto sayı = 42; auto kesirliSayı = 1.2; auto selam = "Merhaba"; auto vida = BisikletVitesDüzeneğininAyarVidası(10);
"auto", otomatik anlamına gelen "automatic"in kısaltmasıdır. Buna rağmen türün otomatik olarak anlaşılması kavramı ile ilgili değildir. Aslında değişkenlerin yaşam süreçleri ile ilgili olan auto
, tanım sırasında başka belirteç bulunmadığı zaman kullanılır.
Başka belirteçler de türün otomatik olarak anlaşılması için yeterlidir:
immutable i = 42;
Zaten immutable
yazılmış olduğu için türün değişmez bir int
olduğu o yazımdan da otomatik olarak anlaşılır. (immutable
anahtar sözcüğünü daha sonra göreceğiz.)
typeof
Bu anahtar sözcük, "türü" anlamına gelen "type of" deyiminden türemiştir. Kendisine verilen ifadenin (değişken, nesne, hazır değer, vs.) türünü o ifadeyi hiç işletmeden üretir.
Örneğin zaten tanımlanmış olan int
türünde sayı
isminde bir değişken olduğunu varsayarsak:
int sayı = 100; // bu zaten 'int' olarak tanımlanmış typeof(sayı) sayı2; // "sayı'nın türü" anlamında typeof(100) sayı3; // "100 hazır değerinin türü" anlamında
Yukarıdaki son iki ifade, şu ikisinin eşdeğeridir:
int sayı2; int sayı3;
Türlerin zaten bilindiği yukarıdaki gibi durumlarda typeof
'un kullanılmasına gerek olmadığı açıktır. Bu anahtar sözcük özellikle daha sonra anlatılacak olan şablon ve katma (mixin) olanaklarının kullanımında yararlıdır.
Problem
42 gibi bir hazır değerin D'nin tamsayı türlerinden int
türünde olduğunu yukarıda okudunuz. (Yani short
, long
, vs. değil.) Bir program yazarak 1.2 gibi bir hazır değerin türünün D'nin kesirli sayı türlerinden hangisinden olduğunu bulun: float
mu, double
mı, yoksa real
mi? Yeni öğrendiğiniz typeof
ve Temel Türler bölümünde öğrendiğiniz .stringof
işinize yarayabilir.