[],&[]和vec![]声明之间有什么区别?

tai*_*bur 2 rust

以下三个声明之间有什么区别?我了解vec!宏的作用。那么,什么时候使用ab声明?

let a = [1, 2, 3];
let b = &[1, 2, 3];
let c = vec![1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

Anl*_*ler 7

尽管这是基本信息,但您在开始阅读Rust文档或The Rust Book时应立即找到,但这里有一些简要说明:

  1. 数组

let a = [1, 2, 3] 是3个元素的数组,它们完全位于堆栈中

stack:

+-----------+
| 1 | 2 | 3 |
+-----------+

Run Code Online (Sandbox Code Playgroud)
  1. 切片

let b = &[1, 2, 3] 是对堆栈中3个元素的数组的引用:

         stack:
                 +-----------+
                 | 1 | 2 | 3 |
                 +-----------+
                 ^
         +---+   |
pointer: | * |---|
         +---+
Run Code Online (Sandbox Code Playgroud)

但是,如果将其更改为let b: &[u32] = &[1, 2, 3]b将不仅是对数组的引用,而是对切片的引用,因为Rust将执行Deref强制。切片是引用,它们还存储它们指向的内容的长度(这种引用称为fat-pointer):

         stack:
                 +-----------+
                 | 1 | 2 | 3 |
                 +-----------+
                 ^
         +---+   |
pointer: | * |---|
         +---+
length:  | 3 |
         +---+
Run Code Online (Sandbox Code Playgroud)
  1. Vec

let c = vec![1, 2, 3] 是动态分配的向量,也就是说,它的数据将驻留在堆中,以便能够在运行时更改其大小,但是它将在堆栈中存储对堆数据的引用,向量的长度和容量:

            stack:       heap:
            +---+     +-----------+---+
pointer:    | * |---->| 1 | 2 | 3 |...|
            +---+     +-----------+---+
length:     | 3 |
            +---+
capacity:   | 4 |
            +---+
Run Code Online (Sandbox Code Playgroud)

  • 你好,谢谢你的精彩解释。我正在阅读《Rust 编程书籍》。那本书中的大多数示例都使用字符串切片。所以,我忘记了其他类型的切片是什么样子的。仍在学习。 (2认同)