【Rust】閉包-捕獲變數
阿新 • • 發佈:2021-12-01
環境
- 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 中的閉包捕獲變數的幾種方式。