在Rust book和docs中,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”?
答案 0 :(得分:3)
str
的文档始于
str
类型,也称为“字符串切片”,
引号在这里很重要。 str
是一个“字符串切片”,与简单的“切片”不同。它们之所以共享名称是因为它们非常相似,但彼此之间没有任何关联。
不过,您可以使用as_bytes
从'str'中获取常规切片。还有一个mutable version,这是不安全的,因为您可以使用它来破坏&str
上的&[u8]
的重要不变式:UTF-8有效性。