如果 str 是“字符串切片”,为什么 std::slice 毯子实现不能在 str 上工作?

Jan*_*n15 5 string slice rust

Rust 书籍文档中,str被称为切片(在书中他们说切片到 a String)。因此,我希望str其行为与任何其他切片相同:例如,我应该能够使用std::slice. 然而,情况似乎并非如此:

虽然这按预期工作(游乐场):

fn main() {
    let vec = vec![1, 2, 3, 4];
    let int_slice = &vec[..];
    for chunk in int_slice.chunks(2) {
        println!("{:?}", chunk);
    }
}
Run Code Online (Sandbox Code Playgroud)

这无法编译:(游乐场

fn main() {
    let s = "Hello world";
    for chunk in s.chunks(3) {
        println!("{}", chunk);
    }
}
Run Code Online (Sandbox Code Playgroud)

并出现以下错误消息:

error[E0599]: no method named `chunks` found for type `&str` in the current scope
 --> src/main.rs:3:20
  |
3 |     for chunk in s.chunks(3) {
  |                    ^^^^^^
Run Code Online (Sandbox Code Playgroud)

这是否意味着str不是普通切片?

如果不是: 的特征是什么str,使得它不可能成为切片?

旁注:如果上面是一个“int 切片”,那么不应该str被描述为“char 切片”吗?

mca*_*ton 4

文档str开头为

str类型也称为“字符串切片”,

引号在这里很重要。Astr是一个“字符串切片”,它与简单的“切片”不同。它们共享这个名字是因为它们非常相似,但在其他方面彼此没有关系。

但是,您可以使用 'str' 从 'str' 中获取常规切片as_bytes。还有一个可变版本,它是不安全的,因为您可以使用它来破坏&strover的一个重要不变量&[u8]:UTF-8 有效性。