为什么 Rust Closure 在被调用之前取得所有权
Why does Rust Closure take ownership before being called
我正在阅读 Rust 书,我正在阅读描述闭包的章节。我对以下示例因闭包所有权而出错的原因感到有些困惑:
fn main() {
let x = vec![1, 2, 3];
let equal_to_x = move |z| z == x;
println!("can't use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}
也就是说,为什么 equal_to_x
在 x
被调用之前就取得了它的所有权?编译器难道不应该知道闭包还没有被调用吗(因为它属于 main
),因此 x 仍然可以属于 main
的外部范围?
因为闭包本质上是一个结构和一个与之关联的函数。我发现更容易想到这样的闭包:
struct MyClosure{
x: Vec<i32>
};
impl MyClosure {
pub fn execute(self, z: Vec<i32>) -> bool {
z == self.x
}
}
如果这样想,你的代码就等同于
let equal_to_x = MyClosure {
x
};
这样您就可以了解为什么会发生此移动。
我正在阅读 Rust 书,我正在阅读描述闭包的章节。我对以下示例因闭包所有权而出错的原因感到有些困惑:
fn main() {
let x = vec![1, 2, 3];
let equal_to_x = move |z| z == x;
println!("can't use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}
也就是说,为什么 equal_to_x
在 x
被调用之前就取得了它的所有权?编译器难道不应该知道闭包还没有被调用吗(因为它属于 main
),因此 x 仍然可以属于 main
的外部范围?
因为闭包本质上是一个结构和一个与之关联的函数。我发现更容易想到这样的闭包:
struct MyClosure{
x: Vec<i32>
};
impl MyClosure {
pub fn execute(self, z: Vec<i32>) -> bool {
z == self.x
}
}
如果这样想,你的代码就等同于
let equal_to_x = MyClosure {
x
};
这样您就可以了解为什么会发生此移动。