Namaran

Code daily. Without assist.

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では型検査の時点でそもそも成立しません。