2026-09-12
chain_assign.rs
fn main() {
let mut a: i32;
let mut b: i32;
a = b = 5;
println!("{a}");
}
C言語なら見慣れた連鎖代入です。これはコンパイルできるでしょうか。
Answer
コンパイルできません。a = b = 5;はa = (b = 5)と解釈されますが、Rustでは代入式b = 5自体の型は代入された値の型(i32)ではなく、常にユニット型()です。そのため外側はa = ()をi32の変数に代入しようとしていることになり、型が合わずエラーになります。「代入は値を返す式」というC言語ファミリーの感覚のまま連鎖代入やif (x = 5)のような書き方をしても、Rustでは型検査の時点でそもそも成立しません。