Evet...:)
İsim yeterince havalı ama örnek değil.
Çünkü sadece opCall() olanağı kullanılacağız...
Sizden bir ricam var:
Lütfen aşağıya doğru hızlıca inmeyin ve adım adım gidin :)
Önce şöyle bir yapı olsun, 3 renge sahip olan;
Her biri tek noktayı temsil ettiğini hayal edin! Şöyle:
struct Color
{
ubyte r, g, b;
string toString() {
import std.conv : text;
return text(r * g * b);
}
}
Ama yetmez, bir simge (icon file) oluşturduğumuzu düşünelim.
Karmaşaya da gerek yok hani 5 x 5, 25 px yeter:
000 000 000 000 000
000 000 000 000 000
000 000 000 000 000
000 000 000 000 000
000 000 000 000 000
Tamamı siyah noktalar ile dolu (varsayılan kurulum 0) ve
3 renk bilgisi tutan bu veriyi, pekala bir dizi ile temsil edebiliriz...
Hadi, ortasında beyaz 1 nokta da olsun:
void main()
{
Color[5][5] arr;
auto beyaz = Color(255, 255, 255);
arr[2][2] = beyaz;
import std.stdio;
arr.writefln!"%-(%-(%s %)\n%)";
} /* ÇIKTISI:
0 0 0 0 0
0 0 0 0 0
0 0 16581375 0 0
0 0 0 0 0
0 0 0 0 0
*/
Basit gibi ama köşeli parantezler ile kafa karıştırıcı (ilki x: satır, diğeri y: sütun) ve hele ki bu yapı 3D nesnelerin verisini tutsaydı Z, hatta çizgi nesleri için W ile 4 parametreye daha ihtiyaç duyacaktık. Düşünsenize 4 boyutlu bir dizi, evet yeterince karışık değil mi?
Tamam, tamam, daha uzatmayacağım!
Sihirli bir dokunuş yapalım ve ekstra 1 adet Point yapısı ile diziyi sarmalayan başka bir yapı daha ekleyelim. Yani 2 adet yapı ile koordinat sistemini renklerle eşleştireceğiz!
İşte lezzet bombası:
struct Point
{
size_t x, y;
}
struct ArrayMatrix(T)
{
T[][] elements;
size_t length;
this(size_t length)
{
this.length = length;
this.elements = new T[][](length, length);
}
ref T opCall(Point i)
in(i.y < length && i.x < length)
{
return elements[i.y][i.x];
}
}
void main()
{
auto arr = ArrayMatrix!Color(5);
auto beyaz = Color(255, 255, 255);
auto p = Point(2, 2);
arr(p) = beyaz;
import std.stdio;
arr.writeln;
}
Evet, ne düşünüyorusunuz? Lütfen yorumlarınızı eksik etmeyin! Yani bunu okuyan var mı anlayamıyorum. Nokta işareti yazsanız bile kafi, yoksa bu tür makaleler devam etmek pek anlamlı değil.
Sağlıcakla kalın :)
SDB@79