Rust中的向量切片是什么?

11
根据 rust doc,字符串切片是这样定义的:

该字符串是静态分配的,这意味着它被保存在我们编译的程序内,并存在于其运行的整个过程中。

那么向量切片呢? 这些字节码是硬编码的值吗? Rust doc 没有很好地解释什么是向量切片:

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

let vec = vec![1i, 2i, 3i];
let slice = vec.as_slice();
1个回答

13

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

let string = "Hello there.";

这个字符串是静态分配的,意味着它保存在我们编译的程序内,并且在整个运行期间都存在(强调我的)。对于字符串字面量,该字符串是静态分配的,而字符串切片则是指向它的。但是还有其他情况下的字符串切片,它们指向动态分配的字符串。
总的来说,切片是数组中连续的元素序列(不管该数组位于什么位置)。因此,在Rust中:
- 字符串切片是UTF-8编码数组中的字节切片 - 向量切片是类型为T的数组元素(即T型)的切片
如果数组具有静态生命周期(即整个程序的生命周期内都存在),则使用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.

因此,如果 vec 的生命周期为 'a,那么 slice 的类型为 &'a [int],可以在类型签名中看到:
fn as_slice(&'a self) -> &'a [T]

(from the std::vec::Vec page)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接