【问题标题】:How does skip works in Rust?跳过如何在 Rust 中工作?
【发布时间】:2021-02-20 03:21:32
【问题描述】:

我刚刚看到this answer 了解如何在给定的 Rust 字符串中搜索子字符串。代码大致如下:

let s = "Hello, world!";
let ss: String = s.chars().skip(7).take(5).collect();

但我现在很想知道skip 是如何工作的。它真的在开始产生之前迭代了迭代器的前 7 个元素吗?还是在幕后耍花招?

【问题讨论】:

  • 为什么它不能完全按照你的想法做?
  • 因为这是一个字符串,我可以想象这个实现实际上只是相当于将 7 添加到指针并进行边界检查。
  • @tadman 无法添加7,因为Strings 是utf8,所以字符不是固定的字节数。
  • @loganfsmyth 我在这里做了很大的简化,但它可能只是在指针上跳过。
  • 我的意思是,通过足够的简化,一切都是指针:P 我只想指出的是,感觉您的评论具有误导性,因为 7 个字节不是 7 个字符。或者不会误导,但至少可能会增加混乱。

标签: rust


【解决方案1】:

取自Rust documentation

创建一个跳过前 n 个元素的迭代器。 在它们被消耗之后,剩下的元素就会产生。

基本示例:

let a = [1, 2, 3];

let mut iter = a.iter().skip(2);

assert_eq!(iter.next(), Some(&3));
assert_eq!(iter.next(), None);

【讨论】:

    【解决方案2】:

    如果您查看Skip 的实现,您会发现它在内部依赖于Iterator::nth

    Chars implementation of iterator 使用默认的 nth 实现,在循环中调用 next。

    slice::Iter implementation 提供了一个专门的nth 实现,基本上只是碰撞内部光标。

    正如@tadman 提到的,您不能只跳转到 UTF-8 字符串中的字符位置,因此默认实现可能只是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2020-10-27
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多