如何为Vector实现自定义迭代器?Rust中的规范实现方式
Rust中实现过滤Vector元素的自定义迭代器的规范方式
要实现FriendsOnly的iter方法,返回所有满足p.is_friend()为true的Person迭代器,Rust中有两种规范实现方式,其中第一种是更惯用的写法:
方式一:复用标准库迭代器适配器(推荐)
直接利用标准库的filter适配器对Vec的迭代器进行过滤,返回impl Iterator<Item = &Person>即可。这种方式无需手动实现Iterator trait,代码简洁且符合Rust惯用风格:
// 补全Person的定义示例 struct Person { is_friend_flag: bool, } impl Person { fn is_friend(&self) -> bool { self.is_friend_flag } } struct FriendsOnly { all: Vec<Person>, } impl FriendsOnly { pub fn iter(&self) -> impl Iterator<Item = &Person> { self.all.iter().filter(|p| p.is_friend()) } }
这里impl Iterator<Item = &Person>是Rust的返回位置 trait 对象语法,它告诉编译器返回的类型实现了Iterator trait,且迭代项是&Person,无需写出具体的复杂迭代器类型。
方式二:自定义迭代器类型(仅需特殊逻辑时使用)
如果需要为迭代器添加自定义行为,可以定义一个包装过滤迭代器的结构体,并实现Iterator trait:
struct Person { is_friend_flag: bool, } impl Person { fn is_friend(&self) -> bool { self.is_friend_flag } } struct FriendsOnly { all: Vec<Person>, } // 自定义迭代器类型,包装filter后的迭代器 struct FriendsIter<'a> { inner: std::iter::Filter<std::slice::Iter<'a, Person>, fn(&&Person) -> bool>, } impl<'a> Iterator for FriendsIter<'a> { type Item = &'a Person; fn next(&mut self) -> Option<Self::Item> { self.inner.next() } } impl FriendsOnly { pub fn iter(&self) -> FriendsIter<'_> { FriendsIter { inner: self.all.iter().filter(|p| p.is_friend()), } } }
不过这种方式仅在需要扩展迭代器功能时才有必要,大多数场景下方式一已经足够满足需求。
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

