En generisk stack från grunden
Typparametrisk LIFO ovanpå en allocator.
En generisk stack från grunden är en gratis lektion i Zig Academy på CoddyKit. Detta är lektion 1 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.
Vad en stack gör
En stack är en LIFO-samling: det senaste elementet du lägger på är det första du tar bort. Tänk på tallrikar staplade på en bänk. 🍽️
Gör den generisk
För att kunna lagra valfri elementtyp skriver du en funktion som tar en typ och returnerar en struct-typ. Varje anrop ger en stack anpassad för den typen.
fn Stack(comptime T: type) type {
return struct {};
}Lagra element och en allokator
Inuti lagrar structen en växande slice med element samt den allokator som den lånar minne från. Zig döljer aldrig allokering.
return struct {
items: []T,
len: usize,
alloc: std.mem.Allocator,
};Referera till structen med @This
Den returnerade structen saknar namn, så metoderna anger sin egen typ med @This(). Det håller varje metod helt generisk.
const Self = @This();Initiera en tom stack
En init-funktion tar allokatorn och returnerar en ny, tom stack. Inget allokeras förrän du pushar.
fn init(a: std.mem.Allocator) Self {
return .{ .items = &.{}, .len = 0, .alloc = a };
}Push kan misslyckas
När bufferten växer kan minne behöva allokeras, så push returnerar en error union. Anroparen hanterar slut-på-minne-fallet uttryckligen.
fn push(self: *Self, value: T) !void {
// grow then store
}Återanvänd realloc för att växa
För att skapa utrymme ber du allokatorn att realloc-era slicen till en större storlek. Den nya längden bestäms av din tillväxtpolicy.
self.items = try self.alloc.realloc(self.items, self.len + 1);
self.items[self.len] = value;
self.len += 1;Ta bort värdet överst
pop returnerar en optional: det översta elementet om stacken innehåller ett, eller null när den är tom. En tom stack orsakar ingen krasch.
fn pop(self: *Self) ?T {
if (self.len == 0) return null;
self.len -= 1;
return self.items[self.len];
}Frigör det du allokerade
Eftersom du äger bufferten måste du lämna tillbaka den. En deinit-metod frigör slicen genom samma allokator.
fn deinit(self: *Self) void {
self.alloc.free(self.items);
}Använd den
Skapa en konkret typ genom att anropa funktionen och initiera den. Stack(i32) är en riktig, fullständigt kontrollerad typ som är redo att ta emot heltal.
var s = Stack(i32).init(allocator);
defer s.deinit();
try s.push(42);En definition, många stackar
Anropa funktionen med olika typer, så blir varje resultat en separat, specialiserad stack. Stack(u8) och Stack(f64) delar inte kod av misstag.
Snabbkontroll
Din generiska stack behöver heapminne för att växa. Varifrån kommer det minnet?
Sammanfattning
En generisk stack är en typreturnerande funktion som innehåller element och en allokator. Push växer, pop returnerar en optional och deinit frigör minnet. 🎯
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 ”En generisk stack från grunden” gratis?
Ja – hela texten till ”En generisk stack från grunden” 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 ”En generisk stack från grunden”?
Typparametrisk LIFO ovanpå en allocator. 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 1 av 4.
Hur lång tid tar lektionen ”En generisk stack från grunden”?
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
- En generisk stack från grunden
- En enkellänkad lista
- Använda HashMap och AutoHashMap
- Profilering och säkerhetsavvägningar