Generiska datastrukturer
Ett mönster med en funktion som returnerar en typ
Generiska datastrukturer är en gratis lektion i Zig Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Zig Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Zig Academy innehåller totalt 4 lektioner.
Generiska containrar i Zig
För att få en datastruktur att fungera för vilken elementtyp som helst skriver du en funktion som tar en typ och returns en helt ny struct-typ. 📦
En funktion som returnerar en typ
Tricket är att en funktion kan ha returtypen type. Den beräknar och lämnar tillbaka en ny typ vid kompileringen.
fn List(comptime T: type) type {
return struct {};
}Bygg structen inuti
Definiera en struct inuti funktionen vars fält använder typparametern T. Varje anrop skapar en struct anpassad för den elementtypen.
fn Box(comptime T: type) type {
return struct { value: T };
}Namnge den resulterande typen
Anropa funktionen som returnerar typen och lagra resultatet i en const. Nu har du en konkret typ som är redo att användas.
const IntBox = Box(i32);Skapa en instans
Använd den namngivna typen precis som vilken struct som helst. Här skapar vi en Box som innehåller heltalet fyrtiotvå.
const b = IntBox{ .value = 42 };Lägg till metoder i den inre structen
Den returnerade structen kan också innehålla metoder. De ser typparametern och förblir därför helt generiska.
fn Box(comptime T: type) type {
return struct {
value: T,
fn get(self: @This()) T {
return self.value;
}
};
}Få åtkomst till typen med @This
Inuti en anonym returnerad struct kan du inte namnge den direkt, så metoder använder @This() för att hänvisa till den omslutande struct-typen.
self: @This()Många typer från en definition
Anropa funktionen med olika typer så får du separata structar. Box(i32) och Box(f64) är separata, fullständigt kontrollerade typer.
const FloatBox = Box(f64);Detta ligger till grund för standardbiblioteket
Zigs egna ArrayList och HashMap byggs på exakt detta sätt: funktioner som tar en typ och returnerar en konfigurerad containertyp.
const Ints = std.ArrayList(i32);Avgörs helt vid kompileringen
All denna typkonstruktion sker under bygget, så en generisk container har samma cost som en handskriven.
Skicka med en allokerare vid utökning
Containrar som växer lagrar ett fält med en allocator, som skickas in vid initieringen, så att den generiska typen tydligt anger var minnet kommer ifrån.
return struct {
items: []T,
alloc: std.mem.Allocator,
};Snabbkontroll
Du vill ha en generisk stack som fungerar för vilken elementtyp som helst i Zig. Vilket mönster använder du?
Sammanfattning
Skriv en funktion som tar en type och returnerar en struct-typ. Varje anrop ger en konkret, specialiserad container. Så här bygger std sina samlingar. 🎯
Lär dig Zig med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Generiska datastrukturer” gratis?
Ja – hela texten till ”Generiska datastrukturer” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Zig Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Zig Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Generiska datastrukturer”?
Ett mönster med en funktion som returnerar en typ Ni övar på Zig Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Zig Academy?
Du behöver inga förkunskaper. Utbildningen i Zig Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Generiska datastrukturer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Zig Academy-lektionen?
Ja. Varje Zig Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Funktioner som tar en typ
- Generiska datastrukturer
- @TypeOf och typreflektion
- anytype-parametrar