Progrust Library.

// dictionary

ループラベル.

ループラベルは、ループの前に'名前:の形で付ける名前です。breakcontinueは通常最も内側のループを対象にしますが、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から、ループでない普通のブロックにもラベルを付けられます2break '名前 値;でブロックを途中で抜け、渡した値がブロック全体というの値になります。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

  1. The Rust Reference: Loops and other breakable expressions 2 3

  2. Announcing Rust 1.65.0 | Rust Blog

この辞書が使われているページ

backlinks 3

  1. 辞書loop式
  2. 辞書while式
  3. 動かして学ぶRustプログラミング問題集 › 第3章 制御フロー