如何创建含i32泛型迭代器的结构体并实现FromIterator trait
问题分析与解决方案
你的代码出现两个核心错误,原因如下:
类型不匹配错误:
你在为IntIterator<T>实现FromIterator时,T是独立的泛型参数,而from_iter方法中iter.into_iter()返回的是<I as IntoIterator>::IntoIter类型——编译器无法保证这两个类型是同一回事,自然会报错。类型推断失败:
collect需要明确知道目标容器类型,但IntIterator<_>里的下划线仍让编译器无法确定T的具体类型,导致推断失败。
修改后的代码
use std::iter::FromIterator; struct IntIterator<T: Iterator<Item = i32>> { iter: T, } // 调整FromIterator实现,让IntIterator的泛型参数T直接对应I的IntoIter类型 impl<I: IntoIterator<Item = i32>> FromIterator<i32> for IntIterator<I::IntoIter> { fn from_iter(iter: I) -> Self { IntIterator { iter: iter.into_iter(), } } } impl<T: Iterator<Item = i32>> Iterator for IntIterator<T> { type Item = i32; fn next(&mut self) -> Option<Self::Item> { self.iter.next() } } fn main() { let vec = vec![1, 2, 3]; let int_iter: IntIterator<_> = vec.into_iter().collect(); for i in int_iter { println!("{}", i); } }
修改说明
- 重新定义
FromIterator的实现:不再针对任意T的IntIterator<T>,而是让IntIterator的泛型参数T直接等于I::IntoIter(也就是输入迭代器转换后的具体迭代器类型)。这样iter.into_iter()的类型和结构体的iter字段类型完全匹配,解决类型不匹配问题。 - 此时
collect可以正确推断IntIterator<_>中的下划线对应的具体类型(比如std::vec::IntoIter<i32>),类型推断失败的问题也随之解决。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

