自定义Iterator trait实现疑问:可迭代性与for循环执行逻辑
Rust Iterator Trait 常见疑问解答
示例代码
pub struct Iterating_ex { start: u32, end: u32, } impl Iterator for Iterating_ex { type Item = u32; fn next(&mut self) -> Option<u32> { if self.start >= self.end { None } else { let result = Some(self.start); self.start += 1; result } } } fn main() { let example = Iterating_ex { start: 0, end: 5, }; for i in example { println!("{i}"); } }
运行输出
0 1 2 3 4
疑问解答
为结构体实现Iterator trait是否会自动生成可迭代数据类型?为何示例中
example实例可用于for循环?
实现Iteratortrait的类型本身就是迭代器类型,不需要额外生成其他可迭代类型。Rust的for循环语法原生支持所有实现了Iteratortrait的类型——for循环的底层逻辑就是依赖迭代器的next()方法来遍历元素,所以只要你的类型实现了这个trait,就能直接用在for循环里。你示例中的Iterating_ex因为实现了Iterator,所以它本身就是一个合法的迭代器,自然能被for循环遍历。看起来
next方法会被循环调用直到返回None,这一逻辑是如何实现的?
这是Rust编译器对for循环做的语法糖转换。你写的for i in example { ... }会被编译器自动展开成类似以下的代码:
let mut iter = example; loop { match iter.next() { Some(i) => { println!("{i}"); }, None => break, } }
编译器自动帮你完成了迭代器的初始化、循环调用next()方法、匹配返回结果的工作:每次调用next()得到Some(i)时,就执行循环体代码;当next()返回None时,直接跳出循环,结束遍历。
内容的提问来源于stack exchange,提问作者kenta_desu
相关产品推荐
相关产品推荐

