当前位置: 首页 > 知识库问答 >
问题:

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

宋景福
2023-03-14

在Rust book和docs中,str被称为一个切片(在书中,他们称切片为字符串)。因此,我希望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);
    }
}

无法编译:(游乐场)

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切片”,那么str不应该被描述为“char切片”吗?

共有1个答案

范霄
2023-03-14

str的文档以

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

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

但是,您可以使用as_bytes从“str”中获取常规切片。还有一个可变版本,它是不安全的,因为您可以使用它来破坏

 类似资料:
  • 问题内容: 我想知道我什么时候做类似的事情 创建新字符串或返回视图/迭代器 问题答案: Python会进行逐个切片,这意味着每次切片时(非常琐碎的切片(例如)除外),它都会将所有数据复制到一个新的字符串对象中。 根据一位开发人员的说法,之所以做出此选择是因为 [按引用切片]方法更复杂,更难实现并且可能导致意外行为。 例如: 使用“按切片复制”设计,可以立即释放字符串。尽管您只对第一个字符感兴趣,但

  • 问题内容: 我想通过实现以下目标: 我能够做到的唯一方法是: 现在,这个示例以及我真正拥有的是一个长长且混乱的字符串,因此我想将切片放入。我已经研究了docs,但无法找出正确的语法。我的问题是:是否可以在替换字段中切片字符串? 问题答案: 不可以,您无法将切片应用于替换字段中的字符串。 您需要参考Format Specification Mini- Language ;它定义了什么 是 可能的。这

  • 问题内容: 我想将字符串切片转换为指向字符串的指针切片 %!p(string = a)=>字符串 %!p(string = b)=>字符串 %!p(string = c)=>字符串 [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0] 据我了解, 我的变量似乎是一个字符串,而不是指向字符串的指针。 因此应从迭代时复制。 显然我不正确,因为地址仍然相同。如果值不是指针,该

  • 问题内容: Swift中的切片是什么,它与数组有何不同? 从文档中,下标(Range)的类型签名为: 为什么不返回另一个而不是一个? 看起来我可以将切片与数组连接起来: 但这会产生错误: 无法找到接受提供的参数的“下标”的重载 什么是切片? 问题答案: 切片指向数组。当数组已经存在并且切片只能描述其所需部分时,再也没有必要制作另一个数组。 加法会导致隐式强制,因此可以正常工作。为了使您的作业正常进

  • 问题内容: 例如输入:(类型:) 转换示例:(类型:的切片) 问题答案: 除了mhutter的答案外,还请注意您的输入看起来像一个JSON数组(也许是来自JSON文本?)。 如果您这样处理,则可以将其内容编组为一个切片。直接解析其中的数字并不会更快(因为该包使用了反射),但是它肯定更简单: 输出(在Go Playground上尝试):

  • 问题内容: 在Golang中,和之间有什么区别? 我发现这两种方法都可行,但是哪一种更好? 问题答案: 除了fabriziom的答案外,您还可以在“转到切片:用法和内部方法”中看到更多示例,其中提到了的用法: 由于slice()的零值就像 零长度的slice一样 ,您可以声明slice变量,然后在循环中附加到该变量: 这意味着,要附加到切片,您不必先分配内存:切片足以作为要添加的切片。