书中的例子:
fn main() {
let mut list = vec![1, 2, 3];
println!("Before defining closure: {:?}", list);
let mut borrows_mutably = || list.push(7);
// 此处就不能使用 list 变量
println!("{:?}",list);
borrows_mutably();
println!("After calling closure: {:?}", list);
}
编译报错如下
1
共 5 条评论, 1 页
评论区
写评论closure 默认情况下捕获变量的不可变引用,但因为在 closure 内部是 push 操作,所以会捕获变量的可变引用。 在 closure 捕获 list 的可变引用后,直到最后一次调用,否则将一直持有。 那么,按照借用规则:
println! 再想获取 list 的不可变引用就违反借用规则了。
了解了,谢谢
你的确可以通过赋值语句理解(引用以最简单的方式被使用),但具体的做法不对。
复现原问题错误的方式是:
playground
细节:移动引用而不是移动所有权
你移动了 list 的所有权,违反了另一条 借用规则:引用必须使用有效 —— 由于此代码在第 8 行移动 list,第 9 行的独占引用已经失效,从而不能使用。
把
println!("{:?}",list);
改写为let z =list;
,此时会报这样的错误也就是 第五行可以拆分成
这时再调用
let zzz = list;
才会发生上述错误.是否应该这样理解?
--
👇
苦瓜小仔:
&borrows_mutably
携带&mut list
,并跨越下一行的&list
,进行了使用,导致独占引用与共享引用并存,违反借用规则。这不对,使用 borrows_mutably 就意味着使用
&mut list
。出现 immutable borrow的地方,编译器很清楚地告诉你是在println!
内。&borrows_mutably
携带&mut list
,并跨越下一行的&list
,进行了使用,导致独占引用与共享引用并存,违反借用规则。这不对,使用 borrows_mutably 就意味着使用
&mut list
。出现 immutable borrow的地方,编译器很清楚地告诉你是在println!
内。