Zig Academy · Lektion

Generiska datastrukturer

Ett mönster med en funktion som returnerar en typ

Lektion 2 av 413 steg

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. 🎯

Gratis att börja

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

  1. Funktioner som tar en typ
  2. Generiska datastrukturer
  3. @TypeOf och typreflektion
  4. anytype-parametrar
← Tillbaka till Zig Academy