我知道你不允许在Rust中同时创建两个对象的可变引用.我不完全理解为什么以下代码有效:
fn main() {
let mut string = String::from("test");
let mutable_reference: &mut String = &mut string;
mutable_reference.push_str(" test");
// as I understand it, this creates a new mutable reference (2nd?)
test(&mut *mutable_reference);
println!("{}", mutable_reference);
}
fn test(s: &mut String) {
s.push_str(" test");
}
Run Code Online (Sandbox Code Playgroud)
规则
在任何时间点都只能有一个对特定值的可用可变引用。
这不是空间排除(同一块可以有多个引用),而是时间排除。
机制
为了强制执行这一点,&mut T不是Copy;因此呼吁:
test(mutable_reference);
Run Code Online (Sandbox Code Playgroud)
应该将引用移动到test.
实际上这样做会使其在以后无法使用并且不符合人体工程学,因此 Rust 编译器会插入一个自动reborrowing,就像您自己做的那样:
test(&mut *mutable_reference);
Run Code Online (Sandbox Code Playgroud)
如果您想,您可以强制移动:
test({ let x = mutable_reference; x });
Run Code Online (Sandbox Code Playgroud)
效果
再借,本质上就是借:
mutable_reference 只要未命名的临时可变引用存在(或从它借用的任何东西),就会被借用,test,mutable_reference结束。| 归档时间: |
|
| 查看次数: |
365 次 |
| 最近记录: |