fn main() {
let mut n = 123;
let m = &mut n;
println!("n: {}", n);
println!("&n: {}", &n);
//*m = 332; // Ошибка!
modify_ref333(&mut n); // почему же так нормально,
// несмотря, что предыдущая строка вызывает ошибку?
// ведь она делает ТОЖЕ САМОЕ!
println!("n: {}", n);
println!("&n: {}", &n);
}
fn modify_ref333(m: &mut i32) {
*m = 333; // ok
}
如果注释掉*m = 332;
,main
会抛出错误
错误[E0502]:不能
n
作为不可变借用,因为它也作为可变借用
这被解释了,而且似乎是可以理解的。但!毕竟,该函数modify_ref333
做同样的事情——它使用一个可变引用,为地址分配一个值。结果是目标(正如他们在官方教科书中所写的那样)
不可变引用的用户不要期望值会突然从他们下面改变!
只要我们有对相同值的不可变引用,我们也不能有可变引用。不可变引用的用户不要期望值会突然改变!
还没到!“欺骗”编译器这么容易,还是有区别?
PS这就是它的工作原理:
fn main() {
let mut n = 123;
println!("n: {}", n);
println!("&n: {}", &n);
let m = &mut n;
*m = 332;
println!("n: {}", n);
println!("&n: {}", &n);
}
任何人都可以提出一个关于如何使用可变链接的简明规则,以及如何不,我没有在码头找到它(或者更确切地说,那里写的内容被一个例子违反了)