我理解你不允许在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");
}
答案 0 :(得分:4)
在内存中某处有多个可变指针指向同一位置?是。
代码中是否有多个可变指针到可用的同一位置?否。
重新借用一个可变指针会锁定你重新借用的指针。
答案 1 :(得分:4)
规则
在任何时间点,只有一个可用的可变引用特定值。
这不是空间排除(可以对同一篇文章进行多次引用),而是时间排除。
机制
为了强制执行此操作,&mut T
不是Copy
;因此呼吁:
test(mutable_reference);
应将引用移至test
。
实际上这样做会使它以后无法使用而且不符合人体工程学,因此Rust编译器会插入一个自动重新借用,就像你自己做的那样:
test(&mut *mutable_reference);
如果您愿意,可以强制移动:
test({ let x = mutable_reference; x });
效果
重新借贷实质上只是借贷:
mutable_reference
只要存在未命名的临时可变引用(或者借用它的任何东西),就会被借用,test
,mutable_reference
的借用结束。答案 2 :(得分:2)