在 Rust 中迭代、过滤和映射数据从一个结构到另一个结构

Posted

技术标签:

【中文标题】在 Rust 中迭代、过滤和映射数据从一个结构到另一个结构【英文标题】:Iterate, filter and map data from one struct to another in Rust 【发布时间】:2021-08-21 10:42:37 【问题描述】:

结构

pub struct UserAccess 
    pub user: String,
    pub dept: String,
    pub hreflink: String,


pub struct RoleMembers 
    pub role: String,
    pub members: Vec<String>,



pub struct DepartmentAccess 
    pub department: String,
    pub department_id: String,
    pub role_members: Vec<RoleMembers>,

我正在尝试根据来自 UI 的输入(“用户”和“部门”)过滤 DepartmentAccess 结构中的数据,并且需要将“用户”、“部门 ID”和“引用链接”映射到UI 所需的另一个结构 (UserAccess)。但是在构建它时会抛出如下错误。我需要在这里做什么?

代码

  let mut v: Vec<UserAccess> = vec![];
    let access_data = get_access_data();
    let user_data: Vec<UserAccess> = access_data
        .into_iter()
        .filter(|a| a.department == department && a.role_members.iter().any(|b| b.members.contains(&user)))
        .map(|r| 
            v.push(UserAccess 
                user: user,
                dept: r.department_id,
                hreflink: format!("department/", r.department_id),
            )
        )
        .collect();

错误

value of type `Vec<UserAccess>` cannot be built from `std::iter::Iterator<Item=()>`
   |
   = help: the trait `FromIterator<()>` is not implemented for `Vec<UserAccess>`

【问题讨论】:

【参考方案1】:

错误似乎很明显。

collect() 创建一个迭代器返回的集合。但在这里你的地图回调:

    |r| 
        v.push(UserAccess 
            user: user,
            dept: r.department_id,
            hreflink: format!("department/", r.department_id),
        )
    

返回whatever Vec::push returns,即()(也就是什么都没有,不要与不返回混淆)。

这与您请求的Vec&lt;UserAccess&gt; 不兼容。

为什么你们既要填充一个 vec,又要尝试从同一个处理管道同时使用相同的数据收集到一个?

二选一:

要么从回调中返回UserData 并收集到user_data 或者针对它的副作用执行管道并通过突变填充v,在这种情况下我会推荐for_each 或常规for 循环以“泵送”迭代器——迭代器是懒惰的,所以map 本身不会运行任何东西——并且表明最后一步是有副作用的:map 通常用于执行功能转换,并且至少大部分都因其结果而受到重视。而collect 不是运行迭代器完成的正确方法。

【讨论】:

以上是关于在 Rust 中迭代、过滤和映射数据从一个结构到另一个结构的主要内容,如果未能解决你的问题,请参考以下文章

将结构从一个进程发送到另一个进程的最简单方法是什么? [关闭]

Rust中的迭代器的使用:map转换filter过滤fold聚合chain链接

迭代 Rust 中的结构向量

MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段

从 Rust 中的多个音频流中并行获取相同大小的块

Rust 从对的迭代器中收集哈希图