为什么在Rust中&str被称为slice?

6

当它是一个堆栈分配的字符串时,它让我想到它可能是其他字符串的子字符串。我是否对此有误解?


3
我认为您应该查看有关字符串的Rust文档 - nbsp
实际上,字符串切片之所以被称为这样,是因为它们可以引用存储在内存中的字符串子串。这与一般切片相同,一般切片可以引用数组的部分。 - starblue
1个回答

17
当它只是一个堆栈分配的字符串时,这并不完全正确。一个字符串切片(&str)在概念上由两部分构成:
1. 指向字符串开头的指针。 2. 字符串中的字节数。
指针可能引用堆栈、堆甚至常量程序数据上的数据。
它被称为字符串切片,因为它与常规切片(&[T])相似,都是相同的两个部分:指针和长度。
在底层,字符串是u8的切片(&[u8]),但它有一个非常重要的保证:字节序列是有效的UTF-8。
请注意,您可以获取某些东西的“整个子字符串”或“整个切片”,它不一定是严格较小的。例如:
let test_scores = [0, 10, 100];
let all_scores = &test_scores[..]; // or &test_scores[0..3]
let some_scores = &test_scores[0..1];

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