在 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<UserAccess>
不兼容。
为什么你们既要填充一个 vec,又要尝试从同一个处理管道同时使用相同的数据收集到一个?
二选一:
要么从回调中返回UserData
并收集到user_data
或者针对它的副作用执行管道并通过突变填充v
,在这种情况下我会推荐for_each
或常规for
循环以“泵送”迭代器——迭代器是懒惰的,所以map
本身不会运行任何东西——并且表明最后一步是有副作用的:map
通常用于执行功能转换,并且至少大部分都因其结果而受到重视。而collect
不是运行迭代器完成的正确方法。
【讨论】:
以上是关于在 Rust 中迭代、过滤和映射数据从一个结构到另一个结构的主要内容,如果未能解决你的问题,请参考以下文章
将结构从一个进程发送到另一个进程的最简单方法是什么? [关闭]
Rust中的迭代器的使用:map转换filter过滤fold聚合chain链接