看起来,可变引用 u
在下面的代码中自动变为不可变引用
let v = &*u;
然后,u
和v
都是不可变的借用引用,因此两者都是被允许的。
use std::ascii::AsciiExt;
fn show(a: &str) {
println!("a={}", a);
}
fn main() {
let mut t = String::new();
t.push('s');
let u = &mut t;
u.make_ascii_uppercase(); // u is really mutable here
let v = &*u; // u became immutable to allow this?
show(u); // both u and v are now accessible!
show(v);
}
输出:
a=S
a=S
如果我在可变借用之后尝试使用
u
,则会出现问题。show(v);
编译器将会回忆起
let v = &*u;
这真的是不被允许的:
cannot borrow `*u` as mutable because it is also borrowed as immutable
这是一个bug还是真的有“当不再需要可变性时自动将可变借用转换为不可变借用”的原则?我正在使用Rust 1.13.0。
u
是对t
的一个&mut
引用,但直到传递给使用它的函数之前,它实际上并不会借用t
吗? - Chris Emersonu
变为可变引用时,那么创建另一个引用(v
)应该是不允许的。但是代码可以编译通过。这就是我不理解的地方。 - Roman Polach