Ein struct fasst Felder und Funktionen zusammen. Zig hat keine automatische Speicherverwaltung und keinen Garbage Collector: Wer Speicher dynamisch braucht, bekommt einen Allocator übergeben und gibt Speicher mit defer wieder frei. defer führt eine Anweisung beim Verlassen des Blocks aus, errdefer nur im Fehlerfall.
Das macht jeden Speicherzugriff sichtbar und kontrollierbar.
const std = @import("std");
const Punkt = struct {
x: i32,
y: i32,
fn summe(self: Punkt) i32 {
return self.x + self.y;
}
};
pub fn main() !void {
const p = Punkt{ .x = 3, .y = 4 };
std.debug.print("{d}\n", .{p.summe()});
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
var liste: std.ArrayList(i32) = .empty;
defer liste.deinit(allocator);
try liste.append(allocator, 42);
std.debug.print("{d} Element(e)\n", .{liste.items.len});
}Merke
structmit Feldern und Funktionen- Allocators machen Speicher explizit
deferräumt beim Verlassen des Blocks auf
Aufgabe
Lege einen Struct Rechteck mit einer Flächenfunktion an.