テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(rust report) クロージャが利用する環境のみをborrowしていることの証明

fn main() {
    let mut x = 1;
    let mut y = 2;
    let mut cl = || {
      x += 1;
    };
    
    // immutable borrow occurs here
    // println!("x:{}", x);
    
    y += 1;
    println!("y:{}", y);
}

このプログラムは, mut clがその時点での環境(x, y両方)をborrowするのか, あるいは利用しているxのみをborrowするのかという問いを確かめるものである.

結論は後者.

このプログラムはコンパイルが出来る. しかしコメントを外すとcl (lifetimeはmainの最後まで)がxをborrowしてるからimmutable borrowは出来ねえぜとハネられる. これはつまり, clはxはborrowしているがyはborrowしていないことの証明になる.

(追記)

Programming Rust (オライリー)より

“Finally, we create a thread, running the closure move || { ... }. This syntax is a bit strange to read: it denotes a closure of no arguments whose body is the { ... } form. The move keyword at the front indicates that this closure takes ownership of the variables it uses; in particular, only the closure may use the mutable slice band.”