Rust从入门到实战系列三百四十八:实现 Iterator trait 来创建自定义迭代器

本文介绍了如何在Rust中创建一个自定义迭代器,通过实现Iteratortrait,如Counter结构体,仅输出1到5的数字。重点展示了如何通过`next`方法管理和更新内部状态以控制迭代行为。
摘要由CSDN通过智能技术生成

我们已经展示了可以通过在 vector 上调用 iter、into_iter 或 iter_mut 来创建一个迭代器。也可以用标
准库中其他的集合类型创建迭代器,比如哈希 map。另外,可以实现 Iterator trait 来创建任何我们希望
的迭代器。正如之前提到的,定义中唯一要求提供的方法就是 next 方法。一旦定义了它,就可以使用所
有其他由 Iterator trait 提供的拥有默认实现的方法来创建自定义迭代器了!
作为展示,让我们创建一个只会从 1 数到 5 的迭代器。首先,创建一个结构体来存放一些值,接着实现
Iterator trait 将这个结构体放入迭代器中并在此实现中使用其值。
Counter 结构体定义和一个创建 Counter 实例的关联函数 new:
struct Counter {
count: u32,
}
impl Counter {
fn new() -> Counter {
Counter { count: 0 }
}
}
定义 Counter 结构体和一个创建 count 初值为 0 的 Counter 实例的 new 函数
Counter 结构体有一个字段 count。这个字段存放一个 u32 值,它会记录处理 1 到 5 的迭代过程中的位
置。count 是私有的因为我们希望 Counter 的实现来管理这个值。new 函数通过总是从为 0 的 count
字段开始新实例来确保我们需要的行为。
接下来将为 Counter 类型实现 Iterator trait,通过定义 next 方法来指定使用迭代器时的行为# struct Counter {

count: u32,

}

impl Counter {

fn new() -> Counter {

Counter { count: 0 }

}

}

impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> OptionSelf::Item {
if self.count < 5 {
self.count += 1;
Some(self.count)
} else {
None
}
}
}
在 Counter 结构体上实现 Iterator trait
这里将迭代器的关联类型 Item 设置为 u32,意味着迭代器会返回 u32 值集合。再一次,这里仍无需担
心关联类型,第十九章会讲到。
我们希望迭代器对其内部状态加一,这也就是为何将 count 初始化为 0:我们希望迭代器首先返回 1。如
果 count 值小于 6,next 会返回封装在 Some 中的当前值,不过如果 count 大于或等于 6,迭代器会返
回 None。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值