İyi fikir Can: Önce okul! :)
Alıntı (canalpay):
> Orada örneğin şöyle bir eşleme tablosu tanımlamışım:
> bool değiştirildi_mi[string][string][string];
> ```
>
Öyle olur ama onun bir sakıncası da görülebilir. Orada, değiştirilme bilgisi veriden ayrı olarak duruyor. Veriyle ilgili başka bilgiler de olsa, örneğin sıkıştırılmış mı, şifrelenmeli mi, vs., o zaman aynı biçimde devam edersek iki eşleme tablosu daha gerekebilir:
bool sıkıştırılmış_mı[string][string][string];
bool şifrelenmiş_mi[string][string][string];
Bunu ben de eskiden C'de yapıyordum; ama yapıların yararını anladıktan sonra bir daha o duruma düşmedim veya düşmemeye çalıştım. :) Bu işin daha iyisi, ilgilendiğimiz bütün bilgiyi bir arada (bir yapıda veya bir sınıfta), tutmak olabilir.
Kadir Can'ın sorusunun yanıtı, hayır, eşleme tablolarında yalnızca indeks (anahtar) ve değer tutulabilir. Ama Can'ın da gösterdiği gibi, değer olarak başka eşleme tabloları da kullanılabilir; veya benim burada önereceğim gibi bir sınıf kullanılabilir.
Belirli indeksle ilgili olan bilgiler o sınıfın içinde tutulur.
import std.stdio;
import std.string : format;
class KayıtBilgisi
{
/* Asıl veri bu; örnek olsun diye int seçiyorum; herhangi başka bir tür de
* olabilirdi */
int veri;
// Bunlar o veriyle ilgili ek bilgiler
bool değiştirildi_mi;
bool sıkıştırılmış_mı;
bool şifrelenmiş_mi;
/* ... ve daha başka kayıt bilgileri ... */
/* Bir kayıt oluşturulabilmesi için veri değerinin bize söylenmesi şart; o
* yüzden bunu kurucu işlev parametresi olarak almak istiyoruz /
this(int veri)
{
this.veri = veri;
/ Diğerlerinin ilk değerleri 'false'tur; öyle bırakıyorum ama
* özellikle kendimiz de atayabilirdik */
}
/* Bu nesneyi güzelce string'e dönüştürmek için /
override string toString() const
{
/ Örneğin şöyle bir düzende: */
return format("%s (%s,%s,%s)",
veri, değiştirildi_mi, sıkıştırılmış_mı, şifrelenmiş_mi);
}
}
/* Bu, anahtar olarak string kullanan ve içinde KayıtBilgisi tutan bir eşleme
- tablosudur. Programda 'KayıtTablosu' gibi güzel bir ismi olsun diye burada
- 'alias' ile ona güzel bir isim veriyoruz. (Yani bu adım şart değil ama
- yararlı.) */
alias KayıtBilgisi[string] KayıtTablosu;
void main()
{
/* İstenirse hazır değerlerle ilklenebilir: */
KayıtTablosu tablo = [ "kadir can" : new KayıtBilgisi(42),
"can" : new KayıtBilgisi(7),
"ali" : new KayıtBilgisi(3) ];
/* Veya çalışma zamanında veri eklenebilir: */
tablo["veli"] = new KayıtBilgisi(18);
/* Daha sonradan: */
foreach (indeks, değer; tablo) {
writeln(indeks, ": ", değer);
}
/* Bir verinin tabloda bulunup bulunmadığını görmek için */
auto bulunan = "şükran" in tablo;
if (bulunan) {
/* 'bulunan'ın türü bir göstergedir; onun için değerine '*' ile
* erişiyoruz */
writeln("bulunan kayıt: ", *bulunan);
} else {
writeln("Öyle bir kayıt yok");
}
}
Aslında o programda da bir *kopukluk* var: kayıtların indeksleri ile kayıtlar birbirlerinden ayrı duruyorlar. Evet, indeks ve kayıtlar eşleme tablosu tarafından bir arada tutuluyorlar ama bazen indeks de asıl verinin parçasıdır. O zaman 'int' gibi basit veri türü yerine indeksle asıl veriyi bir arada tutan bir yapı veya sınıf kullanılabilir.
Programı şu şekilde değiştirmeye başlayabiliriz:
struct Veri
{
string isim; // <-- indeks de aslında Veri'nin parçası
int kapıNumarası;
}
class KayıtBilgisi
{
Veri veri;
/* ... */
this(Veri veri)
{
Kadir Can, şu dersi görmüş olduğunu ve anlamadığını varsayıyorum: ;)
http://ddili.org/ders/d/esleme_tablolari.html
Bana o dersi daha kolay anlaşılır yapmamda yardım eder misin. Seni neresinde kaybettim? :)
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]