Namaran

Code daily. Without assist.

2026-09-14

loop_types.rs

fn a() -> i32 {
    loop {}
}

fn b() -> i32 {
    while true {}
}

fn c() -> i32 {
    for i in 0.. {
        return i;
    }
}

abcのうち、コンパイルエラーになるのはどれでしょうか?

Answer

bc(どちらも型の不一致、E0308)。breakを持たないloop式は決して値を返さない発散式で、型は!になり、i32を含むどんな型にも合わせられます。一方whileforは、条件がtrueでも範囲が無限でも、式としての型は常に()です。コンパイラは「このループは抜けない」「必ずreturnする」とは推論しないので、関数末尾の値が()になりi32と合いません。