const expect = @import("std").testing.expect; const expectEqual = @import("std").testing.expectEqual; test "if optional" { // If expressions test for null. const a: ?u32 = 0; if (a) |value| { try expectEqual(0, value); } else { unreachable; } const b: ?u32 = null; if (b) |_| { unreachable; } else { try expect(true); } // The else is not required. if (a) |value| { try expectEqual(0, value); } // To test against null only, use the binary equality operator. if (b == null) { try expect(true); } // Access the value by reference using a pointer capture. var c: ?u32 = 3; if (c) |*value| { value.* = 2; } if (c) |value| { try expectEqual(2, value); } else { unreachable; } } test "if error union with optional" { // If expressions test for errors before unwrapping optionals. // The |optional_value| capture's type is ?u32. const a: anyerror!?u32 = 0; if (a) |optional_value| { try expectEqual(0, optional_value.?); } else |err| { _ = err; unreachable; } const b: anyerror!?u32 = null; if (b) |optional_value| { try expectEqual(null, optional_value); } else |_| { unreachable; } const c: anyerror!?u32 = error.BadValue; if (c) |optional_value| { _ = optional_value; unreachable; } else |err| { try expectEqual(error.BadValue, err); } // Access the value by reference by using a pointer capture each time. var d: anyerror!?u32 = 3; if (d) |*optional_value| { if (optional_value.*) |*value| { value.* = 9; } } else |_| { unreachable; } if (d) |optional_value| { try expectEqual(9, optional_value.?); } else |_| { unreachable; } } // test