我有一个带有一系列帖子和一个可选after_id
的函数来跳过id小于或等于给定的帖子。
fn get_page<'a>(data: &'a Vec<u64>, after_id: Option<u64>) -> Vec<&u64> {
let data = data.iter();
let data = match after_id {
Some(id) => data.skip_while(|&&post| post <= id),
None => data,
};
data.take(10).collect()
}
此代码触发编译错误,指出Some
arm创建了iter::SkipWhile
结构,其类型与来自{{1}的posts
类型(slice::Iter
)不兼容} arm。
我看到的唯一解决方法是:None
将match
解构为if
或类似的内容,是:
let posts = match after_id {
Some(id) => posts.skip_while(|post| post.id <= id).collect(),
None => posts.collect(),
};
明显的缺点是我不必要地迭代整个集合并使用额外的内存。
是否可以有条件地应用skip_while
并将结果存储在单个变量中,而不是collect
中间结果?