On Saturday, 27 August 2022 at 07:12:58 UTC, Cos00kun wrote:
> unuttuğum bir şey daha vardı yukarıdaki konuyla ilgili;
D dilimizin kurallarından biri gereği tüm değişkenler tanımlandıkları anda ilklenirler ilkesini düşündüğümüzde bu durumda "auto" yu nereye koymalıyız ?
Ali hocamız gerekenleri anlatmış ve onun üzerine sözüm yok ama bir laf [*] edeyim dedim auto'dan içeri. Derim ki auto'ya çok güvenmemek lazım ve gerektiğinde açıkca tarif etmeli. Tıpkı araba kullanırken navigasyona çok güvenip de bizi bozuk/daracık yollara sokması gibi :)
Farkı gösteren çiftli örnekle adım adım gidelim...
Önce TEST_ok
isminde şöyle özel bir türümüz olsun ve buna çok da takılmayalım çünkü takma adı sayesinde aslında char sarması. Etsiz olan, prinçli :)
struct TEST_ok {
char c = 'd';
alias c this;
}
import std.stdio;
struct TEST_ops {
char c = 'd';
alias d this;
char d()
{
return c;
}
}
void main()
{
TEST_ok ok;
auto test1 = ok;
test1.writeln; //d
assert(is(typeof(test1) == TEST_ok));
TEST_ops ops;
auto test2 = ops;
test2.writeln; // TEST_ops('d')
assert(is(typeof(test2) == TEST_ops));
}
Bir de TEST_ops
isminde başka bir yapımız var ki işlerin yolunda gitmediği diğer dolmamız. Bu biraz etli ama daha lezzetli :)
Neyse, yemeği seven biri olduğum belli olmasın. Oldu mu yoksa!
Şimdi test1
ve test2
'miz var ve bu ikisi de 'd'
karakterini tutmasını istiyorum çünkü kendi türümde bir char
'a bağladım. Ben bunu çok sık yaparım ama auto
kullanırsam her ikisinde de derleyici kopyasını çıkarmak istediğimi zannedecek. Oysa örneklar arası fark, teoride yapı içinde gibi (dikkat: pratikte yapıya bağlanmış ve onun üzerinden erişilebilen tek başına) işlev aslında. En iyisi mi farkı önce ekranda görelim!
Kodu derlediğinizde ekrana gelen sonucun alt alta d harfi olması için test2
'yi açıkca char
olduğunu belirtmeniz gerekiyor. Yoksa d()
işlevi üzerinden döndürülen karakteri ekrana basacağımızdan kopyanın varsayılan toString()
çalıştırılıyor. Bu tercihi yapan write()
ailesi (sanırım formattedWrite
)?
Özetle, örnekte aslında 4 yapı nesnesi var ama bana lazım olan içindeki veri. O yüzden tüm auto
'ları char
olarak değiştirmek veya açıkca üye değişkeni belirtmek gerekiyor. Yoksa gereksiz kopyalarını almış oluyoruz. Zaten writeln()
ile ekrana yazarken de kopyası alınıyor. Neyse çok çok uzattım sanırım!
Başarılar...
[*] Geleneklerimizde 'söz' değerli, 'laf' ise tıpkı temizlik yapılırken önemsiz görülen çer/çöp halı altına atılması gibi değersizdir.