我正在读“锈书”,书上写着:第4.2节
在任何给定的时间,您可以有一个可变引用或任意数量的不可变引用。
然而,我在实验中发现,实际上我可以在同一范围内拥有多个可更改的引用,而无需使用任何不安全的代码:
fn make_mut(x: &mut i32) -> &mut i32 {
x
}
fn main() {
let mut i = 1;
let ir = &mut i;
let ir2 = make_mut(ir);
*ir2 = 2;
println!("{}", *ir);
}输出:
2这里发生了什么事?“锈书”是不是过于简单化了?对于没有经验的锈蚀程序员来说,是否有比锈蚀书更好的信息来源?
发布于 2021-04-06 19:06:53
可变的引用是非Copy的,所以在将ir传递给make_mut之后,它被移动了,不再存在了:
fn make_mut(x: &mut i32) -> &mut i32 {
x
}
fn main() {
let mut i = 1;
let ir = &mut i;
let ir2 = make_mut(ir);
*ir = 3; // error here
*ir2 = 2;
println!("{}", *ir);
}在您的特殊情况下,ir会重新借款;这就是Rust修改代码的方式:
fn make_mut(x: &mut i32) -> &mut i32 {
x
}
fn main() {
let mut i = 1;
let ir = &mut i;
let ir2 = make_mut(&mut *ir); // rust replaces raw `ir` with reborrowed mutable reference to dereferenced `ir`
*ir2 = 2;
println!("{}", *ir);
}如果尝试同时使用这两个可变引用,仍然会出现编译错误。
https://stackoverflow.com/questions/66974963
复制相似问题