最佳答案
尽管彻底阅读了文档,但我对 Rust 中 &
和 *
符号的含义,以及更一般的 Rust 引用的确切含义感到相当困惑。
在这个例子中,它似乎类似于 C + + 引用(也就是说,使用时自动解引用的地址) :
fn main() {
let c: i32 = 5;
let rc = &c;
let next = rc + 1;
println!("{}", next); // 6
}
然而,以下代码的工作原理完全相同:
fn main() {
let c: i32 = 5;
let rc = &c;
let next = *rc + 1;
println!("{}", next); // 6
}
在 C + + 中,使用 *
来取消引用是不正确的。所以我想知道为什么在 Rust 中这是正确的。
到目前为止,我的理解是,在 Rust 引用前插入 *
会解除对它的引用,但是 *
是隐式插入的,所以你不需要添加它(在 C + + 中,它是隐式插入的,如果你插入它,你会得到一个编译错误)。
然而,这样的东西不能编译:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = rc + 1;
}
println!("{}", next);
}
error[E0369]: binary operation `+` cannot be applied to type `&mut i32`
--> src/main.rs:6:16
|
6 | next = rc + 1;
| ^^^^^^
|
= note: this is a reference to a type that `+` can be applied to; you need to dereference this variable once for this operation to work
= note: an implementation of `std::ops::Add` might be missing for `&mut i32`
但这种方法是有效的:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
似乎隐式解引用(la C + +)对于不可变引用是正确的,但对于可变引用则不是。为什么会这样?