【问题标题】:Iterate, filter and map data from one struct to another in Rust在 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>`

【问题讨论】:

    标签: dictionary struct filter rust iterator


    【解决方案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 不是运行迭代器完成的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多