首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让一个函数返回具有相同项类型的两个迭代器之一?

如何让一个函数返回具有相同项类型的两个迭代器之一?
EN

Stack Overflow用户
提问于 2022-04-20 03:37:03
回答 1查看 198关注 0票数 3

下面是不编译,因为这两个迭代器有不同的签名。但是,两个迭代器返回相同的项类型,并且在概念上表现相同。

代码语言:javascript
复制
fn f(flag: bool) -> impl Iterator<Item = u8> {
    if flag {
        (0..8).into_iter()
    } else {
        (0..8).into_iter().map(|x| x + 1)
    }
}

我想要编写一个函数,该函数返回从算法的不同变体中生成的项,这些项是由传递给函数的值选择的。我怎样才能做到这一点?

最终,我需要在no_std环境中使用它。这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 04:41:39

我不知道有什么内置的方法可以做到这一点,但是实现一些有用的东西并不是太困难。

您需要的是一种可以同时表示(0..8).into_iter()的结果的类型--这是一种Iterator<Item=u8>,也是(0..8).into_iter().map(|x| x+1)。如果您不想使用盒式特征,典型的选择是创建一个带有两个选项的枚举。

然后,如果您在枚举上实现了Iterator<Item=u8>,那么就完成了。

这样的枚举看起来可能是:

代码语言:javascript
复制
pub enum EitherIter<AIterType, BIterType> {
    A(AIterType),
    B(BIterType),
}

impl<AIterType, BIterType> Iterator for EitherIter<AIterType, BIterType>
where
    AIterType: Iterator,
    BIterType: Iterator<Item = AIterType::Item>,
{
    type Item = AIterType::Item;
    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
        match self {
            EitherIter::A(it) => it.next(),
            EitherIter::B(it) => it.next(),
        }
    }
}

然后使用它,将每个返回类型包装在其中一个类型中。

代码语言:javascript
复制
pub fn f(flag: bool) -> impl Iterator<Item = u8> {
    if flag {
        EitherIter::A((0..8).into_iter())
    } else {
        EitherIter::B((0..8).into_iter().map(|x| x + 1))
    }
}

您可以在游乐场中试用这种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71933809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档