Skip to content

Commit

Permalink
Merge pull request #18219 from g-cassie/optional-documentation-tweaks
Browse files Browse the repository at this point in the history
Minor improvements to the Optionals documentation
  • Loading branch information
andrewrk authored Jan 19, 2024
2 parents 6ecf3b1 + ef93a36 commit 9b714e0
Showing 1 changed file with 57 additions and 39 deletions.
96 changes: 57 additions & 39 deletions doc/langref.html.in
Original file line number Diff line number Diff line change
Expand Up @@ -4640,13 +4640,23 @@ test "while null capture" {
}
try expect(sum1 == 3);

// null capture with an else block
var sum2: u32 = 0;
numbers_left = 3;
while (eventuallyNullSequence()) |value| {
sum2 += value;
} else {
try expect(sum2 == 3);
}

// null capture with a continue expression
var i: u32 = 0;
var sum3: u32 = 0;
numbers_left = 3;
while (eventuallyNullSequence()) |value| : (i += 1) {
sum3 += value;
}
try expect(i == 3);
}

var numbers_left: u32 = undefined;
Expand Down Expand Up @@ -4927,87 +4937,92 @@ test "if boolean" {
}
}

test "if optional" {
// If expressions test for null.
test "if error union" {
// If expressions test for errors.
// Note the |err| capture on the else.

const a: ?u32 = 0;
const a: anyerror!u32 = 0;
if (a) |value| {
try expect(value == 0);
} else {
} else |err| {
_ = err;
unreachable;
}

const b: ?u32 = null;
if (b) |_| {
const b: anyerror!u32 = error.BadValue;
if (b) |value| {
_ = value;
unreachable;
} else {
try expect(true);
} else |err| {
try expect(err == error.BadValue);
}

// The else is not required.
// The else and |err| capture is strictly required.
if (a) |value| {
try expect(value == 0);
}
} else |_| {}

// To test against null only, use the binary equality operator.
if (b == null) {
try expect(true);
// To check only the error value, use an empty block expression.
if (b) |_| {} else |err| {
try expect(err == error.BadValue);
}

// Access the value by reference using a pointer capture.
var c: ?u32 = 3;
var c: anyerror!u32 = 3;
if (c) |*value| {
value.* = 2;
value.* = 9;
} else |_| {
unreachable;
}

if (c) |value| {
try expect(value == 2);
} else {
try expect(value == 9);
} else |_| {
unreachable;
}
}
{#code_end#}
{#header_open|if with Optionals#}

test "if error union" {
// If expressions test for errors.
// Note the |err| capture on the else.
{#code_begin|test|test_if_optionals#}
const expect = @import("std").testing.expect;

const a: anyerror!u32 = 0;
test "if optional" {
// If expressions test for null.

const a: ?u32 = 0;
if (a) |value| {
try expect(value == 0);
} else |err| {
_ = err;
} else {
unreachable;
}

const b: anyerror!u32 = error.BadValue;
if (b) |value| {
_ = value;
const b: ?u32 = null;
if (b) |_| {
unreachable;
} else |err| {
try expect(err == error.BadValue);
} else {
try expect(true);
}

// The else and |err| capture is strictly required.
// The else is not required.
if (a) |value| {
try expect(value == 0);
} else |_| {}
}

// To check only the error value, use an empty block expression.
if (b) |_| {} else |err| {
try expect(err == error.BadValue);
// 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: anyerror!u32 = 3;
var c: ?u32 = 3;
if (c) |*value| {
value.* = 9;
} else |_| {
unreachable;
value.* = 2;
}

if (c) |value| {
try expect(value == 9);
} else |_| {
try expect(value == 2);
} else {
unreachable;
}
}
Expand Down Expand Up @@ -5056,6 +5071,7 @@ test "if error union with optional" {
}
}
{#code_end#}
{#header_close#}
{#see_also|Optionals|Errors#}
{#header_close#}
{#header_open|defer#}
Expand Down Expand Up @@ -6379,6 +6395,8 @@ test "optional pointers" {
}
{#code_end#}
{#header_close#}

{#see_also|while with Optionals|if with Optionals#}
{#header_close#}
{#header_open|Casting#}
<p>
Expand Down

0 comments on commit 9b714e0

Please sign in to comment.