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

5
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个回答

4

str的文档以以下内容开头:

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

这里引号很重要。 str是“字符串切片”,不同于简单的“切片”。它们之间名称相同是因为它们非常相似,但在其他方面并没有关联。

您可以使用as_bytes从“str”中获取常规切片。还有一个可变版本,由于您可能会使用它来打破&str关于&[u8]的重要不变性:UTF-8有效性,因此它是不安全的。


我只是在学习:str 是否有固有的特性,使其无法成为 &[u8]&[char] - Jan15
1
@Jan15:是的。&str 总是 UTF-8 有效的,而 &[u8] 可以包含任何内容。大多数情况下,u8 也不是与字符串一起使用的真正有用的类型(char 也是如此,这就是为什么 &str&[char] 不同的原因)。 - mcarton

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