2026-09-14
loop_types.rs
fn a() -> i32 {
loop {}
}
fn b() -> i32 {
while true {}
}
fn c() -> i32 {
for i in 0.. {
return i;
}
}
a・b・cのうち、コンパイルエラーになるのはどれでしょうか?
Answer
bとc(どちらも型の不一致、E0308)。breakを持たないloop式は決して値を返さない発散式で、型は!になり、i32を含むどんな型にも合わせられます。一方whileとforは、条件がtrueでも範囲が無限でも、式としての型は常に()です。コンパイラは「このループは抜けない」「必ずreturnする」とは推論しないので、関数末尾の値が()になりi32と合いません。