gpt4 book ai didi

rust - 如何仅为具有特定项的迭代器实现迭代器适配器?

转载 作者:行者123 更新时间:2023-11-29 08:07:54 24 4
gpt4 key购买 nike

我正在尝试为 Iterator 编写自定义适配器:

use std::iter::Iterator;

struct LexIter<Iter> {
last_char: Option<char>,
iter: Iter,
}

impl<Iter> LexIter<Iter> {
fn put_back(&mut self, ch: char) {
self.last_char = Some(ch);
}
}

impl<Iter: Iterator> Iterator for LexIter<Iter> {
type Item = char;

fn next(&mut self) -> Option<char> {
match self.last_char {
Some(ch) => {
let res = ch;
self.last_char = None;
Some(res)
}
None => self.iter.next(),
}
}
}

impl<Iter: Iterator> std::convert::From<Iter> for LexIter<Iter> {
fn from(it: Iter) -> Self {
LexIter {
last_char: None,
iter: it,
}
}
}

编译时出现错误

error[E0308]: match arms have incompatible types
--> src/main.rs:18:9
|
18 | match self.last_char {
| ^ expected char, found associated type
|
= note: expected type `std::option::Option<char>`
= note: found type `std::option::Option<<Iter as std::iter::Iterator>::Item>`
note: match arm with an incompatible type
--> src/main.rs:24:21
|
24 | None => self.iter.next(),
| ^^^^^^^^^^^^^^^^

我明白 self.iter.next()返回 Option<Iter::Item> ,但我只想为那些具有 Iterator::Item 的迭代器制作一个适配器作为char .

有没有办法在函数签名中明确指定类型?

最佳答案

在特征边界中为关联类型 Item 指定一个值:

impl<Iter> Iterator for LexIter<Iter>
where Iter: Iterator<Item = char>
{
// ...
}

另外:

  1. 我相信您的实现可以简化为

    fn next(&mut self) -> Option<char> {
    self.last_char.take().or_else(|| self.iter.next())
    }
  2. 看起来您正在实现与 Peekable 非常接近的东西适配器;也许您可以改用它。

  3. 如果没有,你可以使用put_back来自很棒的 Itertools crate。

关于rust - 如何仅为具有特定项的迭代器实现迭代器适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40540636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com