【问题标题】:Why are `Item`s of a `Char` iterator, obtained from calling `chars` on a string slice, not references to `char`s?为什么`Char`迭代器的`Item`s是通过在字符串切片上调用`chars`获得的,而不是对`char`s的引用?
【发布时间】:2017-12-03 20:07:19
【问题描述】:

运行以下代码将导致编译器抱怨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)来初始化的。鉴于&amp;str 是对特定内存区域的引用(我假设是一个连续区域?),Chars 不会真的迭代对构成str 的组件chars 的引用? Rust 的自动解除引用在这里起作用了吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

    另见Iterator impl for std::str::CharsItem 类型。

    【讨论】:

    • 这是否意味着每次我在&amp;str 上调用Chars 时,我都会创建一个新的解码字符副本?
    • 可以,但是解码后的字符不会同时存储(除非你自己做)。解码它们显然涉及一些 cpu 周期,但迭代器将它们一一返回。调用chars() 只是创建迭代器,字符只有在你遍历它时才会被实际解码,即调用next() 直到它完成。
    猜你喜欢
    • 2021-03-16
    • 2022-12-08
    • 2019-03-04
    • 2021-03-15
    • 2010-12-14
    相关资源
    最近更新 更多