langref: document labeled blocks, labeled for, labeled while

closes #1327
This commit is contained in:
Andrew Kelley 2018-08-27 20:59:28 -04:00
parent fb6d3859e8
commit 048f506aa6
No known key found for this signature in database
GPG Key ID: 4E7CD66038A4D47C

View File

@ -2179,6 +2179,39 @@ test "@tagName" {
sorts the order of the tag and union field by the largest alignment. sorts the order of the tag and union field by the largest alignment.
</p> </p>
{#header_close#} {#header_close#}
{#header_open|blocks#}
<p>
Blocks are used to limit the scope of variable declarations:
</p>
{#code_begin|test_err|undeclared identifier#}
test "access variable after block scope" {
{
var x: i32 = 1;
}
x += 1;
}
{#code_end#}
<p>Blocks are expressions. When labeled, <code>break</code> can be used
to return a value from the block:
</p>
{#code_begin|test#}
const std = @import("std");
const assert = std.debug.assert;
test "labeled break from labeled block expression" {
var y: i32 = 123;
const x = blk: {
y += 1;
break :blk y;
};
assert(x == 124);
assert(y == 124);
}
{#code_end#}
<p>Here, <code>blk</code> can be any name.</p>
{#see_also|Labeled while|Labeled for#}
{#header_close#}
{#header_open|switch#} {#header_open|switch#}
{#code_begin|test|switch#} {#code_begin|test|switch#}
const assert = @import("std").debug.assert; const assert = @import("std").debug.assert;
@ -2374,6 +2407,28 @@ fn rangeHasNumber(begin: usize, end: usize, number: usize) bool {
} else false; } else false;
} }
{#code_end#} {#code_end#}
{#header_open|Labeled while#}
<p>When a <code>while</code> loop is labeled, it can be referenced from a <code>break</code>
or <code>continue</code> from within a nested loop:</p>
{#code_begin|test#}
test "nested break" {
outer: while (true) {
while (true) {
break :outer;
}
}
}
test "nested continue" {
var i: usize = 0;
outer: while (i < 10) : (i += 1) {
while (true) {
continue :outer;
}
}
}
{#code_end#}
{#header_close#}
{#header_open|while with Optionals#} {#header_open|while with Optionals#}
<p> <p>
Just like {#link|if#} expressions, while loops can take an optional as the Just like {#link|if#} expressions, while loops can take an optional as the
@ -2560,6 +2615,37 @@ test "for else" {
}; };
} }
{#code_end#} {#code_end#}
{#header_open|Labeled for#}
<p>When a <code>for</code> loop is labeled, it can be referenced from a <code>break</code>
or <code>continue</code> from within a nested loop:</p>
{#code_begin|test#}
const std = @import("std");
const assert = std.debug.assert;
test "nested break" {
var count: usize = 0;
outer: for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
count += 1;
break :outer;
}
}
assert(count == 1);
}
test "nested continue" {
var count: usize = 0;
outer: for ([]i32{ 1, 2, 3, 4, 5, 6, 7, 8 }) |_| {
for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
count += 1;
continue :outer;
}
}
assert(count == 8);
}
{#code_end#}
{#header_close#}
{#header_open|inline for#} {#header_open|inline for#}
<p> <p>
For loops can be inlined. This causes the loop to be unrolled, which For loops can be inlined. This causes the loop to be unrolled, which