sou*_*ics 10 mutable dereference rust borrowing
fn main() {
// block1: fails
{
let mut m = 10;
let n = {
let b = &&mut m;
&**b // just returning b fails
};
println!("{:?}", n);
}
// block2: passes
{
let mut m = 10;
let n = {
let b = &&m;
&**b // just returning b fails here too
};
println!("{:?}", n);
}
}
Run Code Online (Sandbox Code Playgroud)
block1因错误而失败:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:7:22
|
7 | let b = &&mut m;
| ^^^^^^ temporary value does not live long enough
8 | &**b // just returning b fails
9 | };
| - temporary value dropped here while still borrowed
...
12 | }
| - temporary value needs to live until here
Run Code Online (Sandbox Code Playgroud)
假设内部不可变引用扩展到block2范围之外,我是否正确,而在block1中,即使存在外部引用,内部可变引用也总是被删除?
这里将可变借用视为非Copy结构(S在下面的代码片段中)就足够了,它取得了引用值的所有权.该模型代表了可变借入的独有性质.
基于此模型的推理:在块2中n是对原始的引用m,而在块1中n最终将成为m对可变借入所拥有的副本的引用.在两个块中,内部引用在let-block的末尾被删除,但是仅在块1中这会导致问题,因为在块1中,n当删除此内部引用时,引用的目标仍然由内部引用所拥有.
struct S { m: i32 }
let mut m = 10;
let n = {
let s = S { m };
let b = &s;
&(*b).m
}; // s is dropped
println!("{:?}", n);
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中s取得了所有权的副本m.该引用n将指向n删除时s丢弃的副本- 不允许.如果m是非复制,m将被移入s,这将具有相同的含义.
在块2中,原件m直接借用而不复制它.如果强制复制,则会出现与block1相同的错误:
let mut m = 10;
let n = {
let m2 = m;
let mut a = &m2;
let b = &a;
&**b
};
println!("{:?}", n);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |