Rustのbreakとラベル付きループのメモ

たまに使いたくなるたびに調べているのでメモ

fn main() {
    // loopは式なのでbreakで値を返すことができる. forやwhileではできない. 
    let n = {
        let mut n = 3;
        loop {
            if 2u32.pow(n)+ n >= n.pow(3)-n {
                break n;
            }
            n += 1;
        }
    };
    println!("The minimum integer n >= 3 satisfying 2^n +n >= n^3-n is {}.",n);

    // loop, while, forにはラベルを付けてbreak, continueすることができる. 
    let mut x = (0,0,0);
    'main: for i in  2.. {
        'sub: for j in 2..300 {
            for k in 2..300 {
                if 2*j+k <= 200 {
                    continue 'sub;
                }
                if i+j+k >= 1000 {
                    x = (i,j,k);
                    break 'main;
                }
            }
        }
    }
    println!("An example of (i,j,k) satisfying 2*j+k > 200 and i+j+k <= 1000 is ({},{},{}).",x.0,x.1,x.2)
}

実行結果

The minimum integer n >= 3 satisfying 2^n +n >= n^3-n is 10.
An example of (i,j,k) satisfying 2*j+k > 200 and i+j+k <= 1000 is (402,299,299).