authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-08-27 20:59:28-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-08-27 20:59:28-04:00
log048f506aa6b78dd13a593b6bb12a317c5a047bc7
treebe56428dc3d74a13daf86c331cfc74d1ee982493
parentfb6d3859e80faf98335c55414bb73490977d2089
signaturelock-open Commit is signed but in an unrecognized format.

langref: document labeled blocks, labeled for, labeled while

closes #1327

1 files changed, 86 insertions(+), 0 deletions(-)

doc/langref.html.in+86
...@@ -2179,6 +2179,39 @@ test "@tagName" {...@@ -2179,6 +2179,39 @@ test "@tagName" {
2179 sorts the order of the tag and union field by the largest alignment.2179 sorts the order of the tag and union field by the largest alignment.
2180 </p>2180 </p>
2181 {#header_close#}2181 {#header_close#}
2182 {#header_open|blocks#}
2183 <p>
2184 Blocks are used to limit the scope of variable declarations:
2185 </p>
2186 {#code_begin|test_err|undeclared identifier#}
2187test "access variable after block scope" {
2188 {
2189 var x: i32 = 1;
2190 }
2191 x += 1;
2192}
2193 {#code_end#}
2194 <p>Blocks are expressions. When labeled, <code>break</code> can be used
2195 to return a value from the block:
2196 </p>
2197 {#code_begin|test#}
2198const std = @import("std");
2199const assert = std.debug.assert;
2200
2201test "labeled break from labeled block expression" {
2202 var y: i32 = 123;
2203
2204 const x = blk: {
2205 y += 1;
2206 break :blk y;
2207 };
2208 assert(x == 124);
2209 assert(y == 124);
2210}
2211 {#code_end#}
2212 <p>Here, <code>blk</code> can be any name.</p>
2213 {#see_also|Labeled while|Labeled for#}
2214 {#header_close#}
2182 {#header_open|switch#}2215 {#header_open|switch#}
2183 {#code_begin|test|switch#}2216 {#code_begin|test|switch#}
2184const assert = @import("std").debug.assert;2217const assert = @import("std").debug.assert;
...@@ -2374,6 +2407,28 @@ fn rangeHasNumber(begin: usize, end: usize, number: usize) bool {...@@ -2374,6 +2407,28 @@ fn rangeHasNumber(begin: usize, end: usize, number: usize) bool {
2374 } else false;2407 } else false;
2375}2408}
2376 {#code_end#}2409 {#code_end#}
2410 {#header_open|Labeled while#}
2411 <p>When a <code>while</code> loop is labeled, it can be referenced from a <code>break</code>
2412 or <code>continue</code> from within a nested loop:</p>
2413 {#code_begin|test#}
2414test "nested break" {
2415 outer: while (true) {
2416 while (true) {
2417 break :outer;
2418 }
2419 }
2420}
2421
2422test "nested continue" {
2423 var i: usize = 0;
2424 outer: while (i < 10) : (i += 1) {
2425 while (true) {
2426 continue :outer;
2427 }
2428 }
2429}
2430 {#code_end#}
2431 {#header_close#}
2377 {#header_open|while with Optionals#}2432 {#header_open|while with Optionals#}
2378 <p>2433 <p>
2379 Just like {#link|if#} expressions, while loops can take an optional as the2434 Just like {#link|if#} expressions, while loops can take an optional as the
...@@ -2560,6 +2615,37 @@ test "for else" {...@@ -2560,6 +2615,37 @@ test "for else" {
2560 };2615 };
2561}2616}
2562 {#code_end#}2617 {#code_end#}
2618 {#header_open|Labeled for#}
2619 <p>When a <code>for</code> loop is labeled, it can be referenced from a <code>break</code>
2620 or <code>continue</code> from within a nested loop:</p>
2621 {#code_begin|test#}
2622const std = @import("std");
2623const assert = std.debug.assert;
2624
2625test "nested break" {
2626 var count: usize = 0;
2627 outer: for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2628 for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2629 count += 1;
2630 break :outer;
2631 }
2632 }
2633 assert(count == 1);
2634}
2635
2636test "nested continue" {
2637 var count: usize = 0;
2638 outer: for ([]i32{ 1, 2, 3, 4, 5, 6, 7, 8 }) |_| {
2639 for ([]i32{ 1, 2, 3, 4, 5 }) |_| {
2640 count += 1;
2641 continue :outer;
2642 }
2643 }
2644
2645 assert(count == 8);
2646}
2647 {#code_end#}
2648 {#header_close#}
2563 {#header_open|inline for#}2649 {#header_open|inline for#}
2564 <p>2650 <p>
2565 For loops can be inlined. This causes the loop to be unrolled, which2651 For loops can be inlined. This causes the loop to be unrolled, which