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);
}
任何人都可以提出一个关于如何使用可变链接的简明规则,以及如何不,我没有在码头找到它(或者更确切地说,那里写的内容被一个例子违反了)
在 Rust 中,一次只能使用一个可变对象引用。第一个示例编译是因为没有使用引用,并且编译器在检查时根本没有考虑到它。一旦您尝试以某种方式使用该链接,就会出现错误。函数的传递成功,因为引用
&n已经超出范围。第二个例子的工作原理相同。一次只使用一个链接。显然,编译器在上次使用后不尊重该引用。好吧,另一个例子来演示一旦你尝试使用一个变量,当它有一个可变引用时,编译器就会返回一个错误。