1. 程式人生 > 其它 >【Rust】閉包-捕獲變數

【Rust】閉包-捕獲變數

環境

  • Rust 1.56.1
  • VSCode 1.61.2

概念

參考:https://doc.rust-lang.org/stable/rust-by-example/fn/closures/capture.html

示例

捕獲引用

fn main() {
    let color = String::from("green");

    // 閉包借用 color 變數
    let print = || println!("`color`: {}", color);
    print();

    // 可以再次不可變借用,因為閉包只捕獲了不可用引用。
    let _reborrow = &color;
    print();

    // 閉包使用完成後,變數可以進行移動。
    let _color_moved = color;
}

捕獲可變引用

fn main() {
    let mut count = 0;
    // 閉包需要使用 mut,因為裡面有 mut count。
    let mut inc = || {
        count += 1;
        println!("`count`: {}", count);
    };

    inc();
    inc();

    // 因為上面的可變借用完了,所以這裡可以再次使用可變借用
    let _count_reborrowed = &mut count;
}

捕獲值

fn main() {
    let haystack = vec![1, 2, 3];
    // haystack 移動到了閉包裡
    let contains = move |needle| haystack.contains(needle);

    println!("{}", contains(&1));
    println!("{}", contains(&4));

    // 上面已經發生了移動,所以這裡不能再次使用了
    // println!("There're {} elements in vec", haystack.len());
}

只能呼叫一次的移動

fn main() {
    use std::mem;

    let movable = Box::new(3);
    let consume = || {
        println!("`movable`: {:?}", movable);
        mem::drop(movable);
    };

    consume();
    // 編譯錯誤,只能呼叫一次
    // consume();
}

總結

瞭解了 Rust 中的閉包捕獲變數的幾種方式。

附錄