什么是Rust中的矢量切片?

Mon*_*ari 8 rust

根据rust doc,字符串切片是:

这个字符串是静态分配的,这意味着它保存在我们编译的程序中,并且在它运行的整个持续时间内都存在.

矢量切片怎么样?这些字节码是硬编码的值吗?

Rust doc没有正确解释什么是矢量切片:

与&str类似,切片是对另一个数组的引用.我们可以使用as_slice()方法从向量中获取切片:

let vec = vec![1i, 2i, 3i];
let slice = vec.as_slice();
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 9

实际上......它并不总是静态分配.请注意具体措辞:

let string = "Hello there.";
Run Code Online (Sandbox Code Playgroud)

这个字符串是静态分配的,这意味着它保存在我们编译的程序中,并且在它运行的整个持续时间内存在(empahsis mine).

在字符串文字的情况下,字符串是静态分配的,字符串切片引用它.但是,还有其他字符串切片的情况,它们引用动态分配的字符串.


通常,切片是数组中连续的元素序列(阵列所在的任何地方).因此,在Rust:

  • 字符串切片是UTF-8编码数组中的一个字节切片
  • 向量切片是T类型为Ts 的数组中的元素(类型)的切片

如果数组具有静态生命周期(即,在程序的整个持续时间内存在),则使用static关键字表示:

&'static str是一个&str具有这种生命周期的(字符串切片),因此它是Rust中字符串文字的精确类型.

否则,生命周期通常与数组所有者的生命周期有关,例如:

let vec = vec!(1i, 2, 3);   // create a dynamically allocated array of 3 `int`
let slice = vec.as_slice(); // create a slice into this array,
                            // the lifetime of which cannot (obviously)
                            // exceed that of the array.
Run Code Online (Sandbox Code Playgroud)

因此,如果vec有一个生命周期'a,那么slice类型&'a [int]可以在类型签名中看到:

fn as_slice(&'a self) -> &'a [T]
Run Code Online (Sandbox Code Playgroud)

(来自std::vec::Vec页面)