Şurdaki (http://ddili.org/forum/post/8638) tartışmadan bu başlığı hortlatma gereği doğdu. Ha keza kendisi bunu fazlasıyla hak ediyordu...:)
Öncelikle 12 gün önce, çekirdek kod içine, bunun en güncel halini yüklemişler:
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/aaA.d
Emin olmamakla birlikte, kullandığımız çağrışımsal dizinin temelini oluşturduğunu zannediyorum. Ancak dilersek aşağıdaki şekilde de kullanabiliriz:
import std.stdio,
yeniAA;
alias yeniAA.AssociativeArray AA;
void main() {
AA!(string,string) aa;
aa["Hello"] = "Привет";
aa["Goodbye"] = "Пока";
aa["Thanks"] = "Спасибо";
foreach (k; aa.byKey) k.write("\t");
writeln();
foreach (v; aa.byValue) v.write("\t");
/*
* struct AssociativeArray(Key,Value) { // AA struct (0)
* ================
* Impl *impl; // Reference semantics (1)
*
* byValue => return ValueRange(impl);
* static struct ValueRange {
* Range state; // Range interface (2)
* this(Impl *p) { state = Range(p); } ...
*
* v => return state.front.value; // Slots struct (3)
* ...ref Value front() pure nothrow @safe { // return }
* }
* (1): Reference semantics
* struct Impl {
* Slot*[] slots;
* size_t nodes;
* Slot*[4] binit; // Prevent extra allocations for very small AA's.
* }
* (2): Range interface
* struct Range {
* Slot*[] slots;
* Slot* curslot; string[] deneme = [ "Hello", "Goodbye", "Thanks" ];
* }
* (3): Slot interface
* struct Slot {
* Slot *next;
* hash_t hash;
* Key key; // alias Key keytype;
* Value value; // alias Value valuetype;
* }
*/
writeln();
}/*
Goodbye Thanks Hello
Пока Спасибо Привет
*/
Aslında ciddi farklılıkları var ve hangisinin yeni olduğunu bilmiyorum. Ama temelde aynılar (0) numaradaki gibi tüm içeriği taşıyan bir yapı var; ve bunun bir işaretçisi (1). Ayrıca bu işaretçi bir aynı isimde bir yapıyı işaret ediyor. Bunun yanında (2) ve (3) numaralı iki önemli yapı türü var. Olay bu kadar basitmiş! Bildiğimiz linked list'in hast-table ile desteklenmişi...:)
Aslında yukarısı çok kafa karıştırmış olabilir. Anlayabilmek için yukarıdaki özeti bizzat kod içinde kendiniz çıkartıp deneme yapmalısınız. Derlemek için şu komut yeterli oluyor:
Alıntı:
> '
dmd testAA.d yeniAA.d ./rt/util/hash.d
'
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]