【发布时间】:2017-10-09 16:50:41
【问题描述】:
我正在尝试根据谓词从向量中删除一些元素,并收集结果。这是一个具有预期结果的(不工作的)示例:
let mut v: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
assert_eq!(v, vec![1, 3, 5]);
assert_eq!(drained, vec![2, 4, 6]);
这会导致错误
error[E0599]: no method named `drain` found for type `std::iter::Filter<std::slice::Iter<'_, i32>, [closure@src/main.rs:4:45: 4:62]>` in the current scope
--> src/main.rs:4:64
|
4 | let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
| ^^^^^
我查看了几种替代方案,但似乎都没有按照我的意愿行事:
Vec::retain从向量中删除元素,但不归还已删除元素的所有权。v.drain(..).filter(condition).collect()为drained返回正确的值,但会清空整个向量。
【问题讨论】:
-
你试过用to_vec转换数组吗?
let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).to_vec().drain(..).collect();