// dictionary
ループラベル.
ループラベルは、ループの前に'名前:の形で付ける名前です。break・continueは通常最も内側のループを対象にしますが、break '名前・continue '名前とラベルを指定すると、ラベルを付けた外側のループを直接脱出・継続できます。loop式・while式・for式のすべてに付けられ、多重ループをまとめて抜けたいときの定番の書き方です1。
fn main() {
let shelves = [["牛乳", "卵"], ["パン", "米"], ["塩", "砂糖"]];
'search: for (index, shelf) in shelves.iter().enumerate() {
for &item in shelf {
if item == "米" {
println!("{}番目の棚で米を見つけました", index + 1);
break 'search; // 内側だけでなく外側のforごと抜けます
}
}
}
}Playgroundで開くラベルの有無による対象の違い
| 書き方 | 対象になるループ |
|---|---|
break / continue(ラベルなし) |
最も内側のループ |
break '名前 / continue '名前 |
'名前:を付けたループ |
補足
ラベル付きブロック式 — ループ以外から値を持って抜ける
Rust 1.65から、ループでない普通のブロックにもラベルを付けられます2。break '名前 値;でブロックを途中で抜け、渡した値がブロック全体という式の値になります。breakで値を返せるのはloop式とこのラベル付きブロック式だけです。なお、ブロック内のbreakはラベルの省略ができず、continueでラベル付きブロックを対象にすることはできません1。
fn main() {
let price = 800;
let shipping = 'calc: {
if price >= 1000 {
break 'calc 0; // 1000円以上なら送料無料で確定します
}
500
};
println!("送料: {shipping}円");
}Playgroundで開くラベルの命名規則とシャドーイング
ラベルはライフタイムと同じ'始まりの構文で書きますが、別物です('_はラベルに使えません)。ラベルはローカル変数と同じシャドーイングの規則に従い、同名ラベルがネストした場合は最も内側のラベルが優先されます1。
Footnotes
この辞書が使われているページ
backlinks 3