为什么`Item`是一个`Char`迭代器,从字符串切片上调用`chars`获得,而不是对`char`s的引用?

时间:2017-12-03 20:07:19

标签: 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的? Rust的自动解除引用在这里发挥作用吗?

1 个答案:

答案 0 :(得分:3)

A &str指向UTF-8编码的字符序列;因为它们是编码的,你不能得到一个迭代器,导致对解码字符的引用,解码后的字符需要按值返回。

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