作者:时光-Goslow | 来源:互联网 | 2022-12-09 11:32
1> Calculator..:
这里将可变借用视为非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);
在上面的代码片段中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);