Rust 为什么要创建一个对一个取消引用的可变引用的可变引用?
我知道你不允许在Rust中同时创建对一个对象的两个可变引用。我不完全理解以下代码为何有效:Rust 为什么要创建一个对一个取消引用的可变引用的可变引用?,rust,Rust,我知道你不允许在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
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");
}
内存中是否有多个可变指针指向同一位置?对
代码中是否有多个指向同一位置的可变指针可用?没有
重新借用可变指针会锁定您借用的指针。我分析了
测试(可变引用)
和测试(&mut*可变引用)
之间的MIR差异。后者似乎只引入了一个额外的间接层次:
当您在函数调用中使用额外的解引用时,它不会创建一个可保存的可变引用;换句话说,它不会在函数调用之外造成任何实际差异。规则 在任何时间点,对特定值只有一个可用的可变参考 这不是一个空间排除(同一个片段可以有多个引用),而是一个时间排除 机制 为了加强这一点,
&mut T
不是Copy
;因此呼吁:
test(mutable_reference);
应将引用移动到测试中
实际上,这样做会使它以后无法使用,而且不符合人体工程学,因此Rust编译器会插入一个自动重新加载,就像您自己做的那样:
test(&mut *mutable_reference);
如果需要,您可以强制移动:
test({ let x = mutable_reference; x });
效果
再借款本质上就是借款:
只要存在未命名的临时可变引用(或从中借用的任何内容),就会被借用mutable_reference
- 将未命名的临时可变引用移动到
测试中
- 在表达式的末尾,未命名的临时可变引用被销毁,因此,
结束mutable_引用的借用