You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:45:09