有一些很绕的概念:

  • &
  • *
  • borrowing

    & 和 borrowing

    首先 & 这个符号并不是取地址符:

    1. fn main() {
    2. let a = 1;
    3. let b = &a;
    4. let ref c = a;
    5. assert_eq!(b, c); // 运行通过
    6. }

    b 和 c 的意思是一样的,那 & 可以理解为 a 声明了一个引用,也就是说 b 和 c 都是引用,而这个过程被称为借用 (borrowing)。
    至于为啥叫借用:

    1. fn main() {
    2. let a: i32;
    3. a = &1; // check 报错
    4. }

    cargo check 的异常:

    1. error[E0308]: mismatched types
    2. --> src/main.rs:3:9
    3. |
    4. 2 | let a: i32;
    5. | --- expected due to this type
    6. 3 | a = &1;
    7. | ^^ expected `i32`, found `&{integer}`
    8. |
    9. help: consider removing the borrow
    10. |
    11. 3 - a = &1;
    12. 3 + a = 1;
    13. |

    注意看 help:移除借用。

    1. help: consider removing the borrow

    那么总结下,表达式中的 &表示借用,其结果为(或者说返回了)一个引用。

    * 和 &

  • 表示解引用,理解他的意思还需要理解 rust 里面引用的意思。
    rust 的引用我觉得可以和 c++ 的指针做类比,借用某块内存数据的过程,就是创建一个指向这块数据的指针,而表示这个指针的变量被称为引用。
    而解引用就是找到这个指针所指向的真正数据在内存的值。

    1. fn main() {
    2. let a = &1;
    3. assert_eq!(*a, 1); // 运行通过
    4. }

    还有一种比较常见的语法,就是 & 在等号左边或者说在赋值、绑定中,其实就是解引用:

    1. fn main() {
    2. let a = &1;
    3. let &b = a;
    4. let c = *a;
    5. assert_eq!(b, c); // 运行通过
    6. }