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

Dictionary 在Rust中迭代、过滤并将数据从一个结构映射到另一个结构,dictionary,struct,filter,rust,iterator,Dictionary,Struct,Filter,Rust,Iterator,Struct 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,

Struct

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>,
}
pub-struct-UserAccess{
发布用户:String,
酒吧部:字符串,
弗林克酒吧:弦乐,
}
发布结构角色成员{
pub角色:String,
酒吧会员:Vec,
}
发布结构部门访问{
酒吧部:字符串,
酒吧部门id:String,
酒吧会员:Vec,
}
我试图根据UI中的输入(“用户”和“部门”)筛选DepartmentAccess结构中的数据,并需要将“用户”、“部门ID”和“reflink”映射到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();
让mut v:Vec=Vec![];
让访问\数据=获取\访问\数据();
让用户访问数据:Vec=访问数据
.into_iter()
.filter(| a | a.department==部门和a.role_members.iter()。任何(| b | b.members.contains(&user)))
.map(| r|{
v、 推送(用户访问){
用户:用户,,
部门:r.部门id,
hreflink:format!(“department/{}”,r.department\u id),
})
})
.收集();
错误

value of type `Vec<UserAccess>` cannot be built from `std::iter::Iterator<Item=()>`
   |
   = help: the trait `FromIterator<()>` is not implemented for `Vec<UserAccess>`
无法从`std::iter::Iterator构建`Vec`类型的
值`
|
=帮助:未为'Vec'实现特性'FromIterator'`
错误似乎很明显

collect()
创建迭代器返回的任何内容的集合。但这里是您的地图回调:

    |r| {
        v.push(UserAccess {
            user: user,
            dept: r.department_id,
            hreflink: format!("department/{}", r.department_id),
        })
    }
返回,即
()
(也称为nothing,不要与不返回混淆)

这与您请求的
Vec
不兼容

为什么你们都在填写一个vec,并试图同时从同一个处理管道收集相同的数据

选择一个或另一个:

  • 从回调中返回
    UserData
    ,并将其收集到
    user\u data
  • 或者针对其副作用执行管道,并通过突变填充
    v
    ,在这种情况下,我建议使用常规
    for
    循环来“泵送”迭代器——迭代器是惰性的,所以
    map
    本身不会运行任何东西——并且表明最后一步是副作用的:
    map
    通常用于执行函数转换,至少主要是因为它们的结果。而
    collect
    不是运行迭代器以完成的正确方法