rust - 为什么 `Item` 迭代器的 `Char` 是通过在字符串切片上调用 `chars` 而获得的,而不是对 `char` 的引用?

标签 rust

运行以下代码将导致编译器提示 PairedNumbers::get返回 (char, char)而不是 (&char, &char) :

use std::iter::{Zip, Cycle, Skip};
use std::str::Chars;

struct PairedNumbers<'a> {
    char_pairs: Zip<Cycle<Chars<'a>>, Skip<Cycle<Chars<'a>>>>,
    counter: usize,
}

impl<'a, 'b: 'a> PairedNumbers<'a> {
    fn new(num_str: &'b str, jump: usize) -> PairedNumbers<'a> {
        PairedNumbers {
            char_pairs: num_str.chars().cycle().zip(num_str.chars().cycle().skip(jump)),
            counter: 0,
        }
    }

    fn get(&'a mut self) -> (&'a char, &'a char) {
        self.counter = self.counter + 1;
        self.char_pairs.next().expect("could not get char pair from unparsed_pairs!")
    }
}

我们看到 PairedNumbers通过在字符串切片的字符上创建迭代器(具体为 Chars)来初始化结构。鉴于 &str是对特定内存区域的引用(我假设是连续区域?),不会 Chars确实在迭代对组件的引用 char组成 str 的 s ? Rust 的自动解除引用在这里起作用了吗?

最佳答案

A &str指向 UTF-8 编码的字符序列;由于它们是经过编码的,因此您无法获得导致对解码字符的引用的迭代器,解码字符需要按值返回。

另请参阅 Iterator impl for std::str::CharsItem 类型.

关于rust - 为什么 `Item` 迭代器的 `Char` 是通过在字符串切片上调用 `chars` 而获得的,而不是对 `char` 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47622748/

相关文章:

regex - Rust程序中的正则表达式

service - 如何使RUST在后台正常运行并守护进程?

rust - 如何将生命限制在使用rust 的封闭环境中?

generics - Rust 特征边界与类型

sockets - 在 BufReader 中包装后无法从底层读取器读取数据

rust - 更新到 Rust 1.18 破坏了编译 : E0034 multiple applicable items in scope for "clone_into"

rust - 基于 lambda 的迭代器的生命周期

rust - 闭包中的可变性问题

struct - Rust:即使使用了作用域,多次借用结构实例作为可变对象也会失败

unix - 有没有办法在 Unix 平台上使用 Rust 更改文件元数据(例如所有者)?