Defer
The defer keyword runs a statement when leaving the
current scope. It’s usually used to clean up or release some
resource.
We can use it to run code at the end of a function:
const std = @import("std");
const print = std.debug.print;
fn f() void {
defer print("defer in f\n", .{});
print("in f\n", .{});
}
pub fn main() void {
f();
}$ zig run defer.zig
in f
defer in f
A deferred statement will always run at the end of the block:
const std = @import("std");
const print = std.debug.print;
fn g() void {
{
defer print("defer in block\n", .{});
print("in block\n", .{});
}
for (1..4) |i| {
defer print("defer in iteration {}\n", .{i});
print("in iteration {}\n", .{i});
}
}
pub fn main() void {
g();
}$ zig run blocks.zig
in block
defer in block
in iteration 1
defer in iteration 1
in iteration 2
defer in iteration 2
in iteration 3
defer in iteration 3
Multiple deferred statements run in reverse order:
const std = @import("std");
const print = std.debug.print;
pub fn main() void {
defer print("defer #1\n", .{});
defer print("defer #2\n", .{});
defer print("defer #3\n", .{});
}$ zig run order.zig
defer #3
defer #2
defer #1
Next example: Errdefer.