defer
對於 C 和 Rust 的使用者是個比較陌生的語法,它是用來在離開目前的作用域(Scope)時自動執行表達式(expression)。
它通常用來處理資源釋放。只要在分配資源程式下增加一個 defer
,就可以確保程式離開 Scope 後會呼叫 defer
並釋放資源。
基礎
語法為 defer expression
。在離開該 defer
所在的 Scope (例如 {}
或函式)時會自動執行所接的 expression。
1 2 3 4 5 6 7 8 9 10
| const print = @import("std").debug.print;
pub fn main() !void { var x: u8 = 10; { defer x += 1; print("X: {}\n", .{x}); } print("X: {}\n", .{x}); }
|
順序
如果有多個 defer
,會以相反的順序執行。
以此例來說,會先執行 x *= 2
,再執行 x += 1
。
1 2 3 4 5 6 7 8 9 10 11
| const print = @import("std").debug.print;
pub fn main() !void { var x: u8 = 10; { defer x += 1; defer x *= 2; print("X: {}\n", .{x}); } print("X: {}\n", .{x}); }
|
區塊
如果要執行的表達式有多行,也可以使用 { }
包圍它們。請注意此處的輸出結果和執行順序!
1 2 3 4 5 6 7 8 9 10 11 12 13
| const print = @import("std").debug.print;
pub fn main() !void { var x: u8 = 10; { defer { x += 1; x *= 2; } print("X: {}\n", .{x}); } print("X: {}\n", .{x}); }
|
函式
函式也算是 Scope,離開函式時也會觸發 defer
。
1 2 3 4 5 6 7 8 9 10 11 12 13
| const print = @import("std").debug.print;
var x: u8 = 10;
pub fn main() !void { foo(); print("X: {}\n", .{x}); }
fn foo() void { defer x += 1; print("X: {}\n", .{x}); }
|
參考
本文以 Zig 0.13.0
為主。並同時發佈在: