Rustの関数の引数でmutを使ったときの挙動

Rustの変数はデフォルトでイミュータブルである。たとえば、

let x = 10;
x = 20;

はエラーとなる。値を更新したい場合は、

let mut x = 10;
x = 20;

とする必要がある (mutmutableの略) 。

本題

fn sample(mut n: i32) -> i32 {
    n += 1;
    n
}

fn main() {
    let n = 10;
    println!("n_before  = {}", n);
    println!("sample(n) = {}", sample(n));
    println!("n_after   = {}", n);
}

を実行すると

n_before  = 10
sample(n) = 11
n_after   = 10

が出力される。mutableといっても、Javaとは違って参照値を渡しているわけではなく、純粋に値を後から代入しなおせるようにするだけの模様。