有一些很绕的概念:
- &
- *
-
& 和 borrowing
首先 & 这个符号并不是取地址符:
fn main() {
let a = 1;
let b = &a;
let ref c = a;
assert_eq!(b, c); // 运行通过
}
b 和 c 的意思是一样的,那 & 可以理解为 a 声明了一个引用,也就是说 b 和 c 都是引用,而这个过程被称为借用 (borrowing)。
至于为啥叫借用:fn main() {
let a: i32;
a = &1; // check 报错
}
cargo check 的异常:
error[E0308]: mismatched types
--> src/main.rs:3:9
|
2 | let a: i32;
| --- expected due to this type
3 | a = &1;
| ^^ expected `i32`, found `&{integer}`
|
help: consider removing the borrow
|
3 - a = &1;
3 + a = 1;
|
注意看 help:移除借用。
help: consider removing the borrow
那么总结下,表达式中的 &表示借用,其结果为(或者说返回了)一个引用。
* 和 &
表示解引用,理解他的意思还需要理解 rust 里面引用的意思。
rust 的引用我觉得可以和 c++ 的指针做类比,借用某块内存数据的过程,就是创建一个指向这块数据的指针,而表示这个指针的变量被称为引用。
而解引用就是找到这个指针所指向的真正数据在内存的值。fn main() {
let a = &1;
assert_eq!(*a, 1); // 运行通过
}
还有一种比较常见的语法,就是 & 在等号左边或者说在赋值、绑定中,其实就是解引用:
fn main() {
let a = &1;
let &b = a;
let c = *a;
assert_eq!(b, c); // 运行通过
}