首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Rust编写自己的可链接迭代器函数?

如何用Rust编写自己的可链接迭代器函数?
EN

Stack Overflow用户
提问于 2019-01-27 16:30:10
回答 1查看 147关注 0票数 0

假设我想将数字迭代器中的每个值加倍。我可以这么做:

代码语言:javascript
复制
vec![1, 2, 3]
    .into_iter()
    .map(|x| x * 2)
    .for_each(|x| println!("{}", x)); //Prints 2, 4, 6.

为了获得更清晰的代码,我更愿意这样做:

代码语言:javascript
复制
vec![1, 2, 3]
    .into_iter()
    .double() //I need to implement this.
    .for_each(|x| println!("{}", x));

如何编写自己的可链接迭代器函数,如本例中的double?我想我必须创建一个接口并为Iterator实现它?有很多类型需要纠正,所以为这个愚蠢的例子提供一个可行的解决方案将是有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-27 16:46:29

首先,您必须创建一个新类型来实现您的迭代器。最简单的方法是包装您想要针对的类型的迭代器:

代码语言:javascript
复制
struct Double<T: ?Sized> {
    inner: T,
}

现在,如果innert类型Iterator的类型是正确的,那么您只需要为该类型实现T特性。类似于:

代码语言:javascript
复制
impl<T> Iterator for Double<T>
where T: Iterator<Item = i32> {
    type Item = i32;
    fn next(&mut self) -> Option<i32> {
        self.inner.next().map(|x| 2*x)
    }
}

就这样!您只需添加一个Double构造函数即可。最符合人体工程学的解决方案是扩展Iterator。就像这样:

代码语言:javascript
复制
trait Doubler : Iterator<Item = i32> {
    fn into_double(self) -> Double<Self>;
}

impl<T> Doubler for T
where T: Iterator<Item = i32> {
    fn into_double(self) -> Double<Self> {
        Double { inner: self }
    }
}

使用示例(游乐场):

代码语言:javascript
复制
fn main() {
    vec![1, 2, 3]
        .into_iter()
        .into_double()
        .for_each(|x| println!("{}", x));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54390299

复制
相关文章

相似问题

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