-
Notifications
You must be signed in to change notification settings - Fork 170
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
6.2.3 闭包和所有权。能不能总结一个正交的规则 #164
Comments
@frostRed 感谢反馈,后续在勘误表里尝试总结一下。不过也希望你可以自己总结一下,分享出来。 |
在 frostRed 的表格上进行了补全,大家看看没有错误
闭包 Trait
move 作用强行让闭包获取捕获的环境变量的所有权,这可能改变闭包本身的性质。下面例子就是,如果没有 move,闭包捕获的是一个 Copy 语意的不可变引用,所以闭包本身也会自动实现 Copy。在闭包前加上 move 强行转移所有权,导致闭包不能自动实现 Copy。 fn main() {
let s = "hello".to_owned();
let f = move || {
println!("{}", s);
};
f();
// foo(f); // 因为 string move 到闭包环境里,让闭包不能自动实现 Copy
}
fn foo<F: Fn() + Copy>(f: F) {
f()
} 同样的道理,用 move 可以让本来不能 Copy 的闭包自动实现 Copy (可变引用没有实现 Copy) fn main() {
let mut x = 0;
let mut f = move || {
x += 1;
println!("{}", x);
};
f();
foo(f);
f();
foo(f);
println!("{}", x);
}
fn foo<F: FnMut() + Copy>(mut f: F) {
f()
} 运行结果,作为函数参数传递的闭包每次复制新的闭包环境:
闭包能否自动实现 Copy取决于捕获的变量类型,如果捕获的是不可变引用、 move 的值本身实现了 Copy,闭包就能自动实现 Copy。 |
@yim7 辛苦了,已加精。 |
复制语义 | 读环境变量 | 无 move | Fn | copy | √ 这里环境变量的处理方式不是copy, 而是immutable borrow.
闭包的类型与闭包中使用环境变量的方式, 以及环境变量是否Copy有关; 可以确认一下是不是这样. |
感谢纠正疏漏之处@loxp |
现在书的内容看完之后有点懵,反而把我以前的理解搞乱了。
比如这段代码
按 179 页第二段说,闭包会以「不可变借用捕获了环境中的自由变量」,那不应该还能在闭包外面使用 &mut 的。
希望作者能帮我解惑。
The text was updated successfully, but these errors were encountered: