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

时间:2019-06-22 19:59:34

标签: string rust slice

Rust bookdocs中,str被称为切片(在书中,他们说是切片成String)。 因此,我希望str的行为与其他任何切片相同:例如,我应该能够使用std::slice中的毯子实现。 但是,情况似乎并非如此:

这可以按预期进行(playground):

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

这无法编译:(playground

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

显示以下错误消息:

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) {
  |                    ^^^^^^

这是否意味着str不是常规切片?

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

附带说明:如果以上内容是“ int slice”,那么str是否应被描述为“ char slice”?

1 个答案:

答案 0 :(得分:3)

str的文档始于

  

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

引号在这里很重要。 str是一个“字符串切片”,与简单的“切片”不同。它们之所以共享名称是因为它们非常相似,但彼此之间没有任何关联。

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