Merhaba,
Kısa kısa geçelim...
Bugün, 26 Nisan 2022 tarihinde 05:02:01 UTC, Ali Çehreli mealen demiş ki:
>İç içe yapılar, içerdikleri bağlam için ek bir işaretçi taşır. Bağlama ihtiyaç duymadıklarında onları 'statik' ile tanımlarız.
Örneğin şöyle:
void main()
{
static struct Sar { // statik yapı
string s;
string toString() {
return s;
}
}
// Veriye ve taşıyıcıya erişim:
auto veri = "beşikibir".chunks(3);
veri.map!(c => c.to!string)
.map!(a => Sar(a)).array.writeln;
// [beş, iki, bir]
/* auto hataVerir = veri.map!(c => c.to!string)
.map!Sar;//*/
// Hatası: cannot access frame pointer of `source.main.Sar`
}
Eğer statik olmasaydı da hata vermeyecekti! Çünkü biz 2. map()
içinde lambda kullandık. Ama main()
dışında her ikisi için de hata vermiyor:
struct Bar { // normal yapı
string s;
string toString() {
return s;
}
}
void main()
{
/* Dikkat bunlar main() dışındaki
statik olmayan Bar()'ı kullanır: */
auto veri = "beşikibir".chunks(3);
veri.map!(c => c.to!string)
.map!(a => Bar(a)).array.writeln;
veri.map!(c => c.to!string)
.map!Bar.array.writeln;
// BONUS: Bu da derlenir:
veri.array
.map!(c => Bar(c.to!string)).writeln;
} /* ÇIKTISI: 3x
[beş, iki, bir]
*/
Çünkü nesne adreslerine bakarsanız biri heap'de, diğeri stack'de barındırılır.
Özetle main() içinde statik kullanmak istemiyorsanız ne yapıp edin lambda kullanmaktan vaz geçmeyin. Ne kadar basit ve pratik görünürse görünsün. Yoksa bir sürü hatalar ile uğraşıyorsunuz.
Sevgiler, saygılar...