您将如何遍历列表并过滤掉响应
Result
不是Ok
的所有值?我想做像 filter_map
这样的事情,但它说我需要返回一个 Option
.
use std::result::Result;
fn match_value(vals: i32) -> Result<i32, i32> {
match vals {
2 => Ok(1),
_ => Err(0),
}
}
fn main() {
let values = vec![1, 2, 3, 2];
let matching = values
.iter()
.map(|name| match_value(*name))
.filter(|x| x.is_ok())
.collect::<Vec<_>>();
println!("{:?}", matching);
}
如果您想要
Ok
中包含的值,请使用Iterator::flat_map
,它将可迭代值组合到一个迭代器中。 Option
和Result
都实现了IntoIterator
:
let matching = values
.iter()
.flat_map(|name| match_value(*name))
.collect::<Vec<_>>();
如果你想要原始值,只需使用
filter
:
let matching = values
.iter()
.filter(|&&name| match_value(name).is_ok())
.collect::<Vec<_>>();
无需导入
Result
;它已经是前奏的一部分了
不确定这是否仍然相关,但也许你想要这样的东西
let matching = values
.iter()
.filter_map(|name| match_value(*name).ok())
.collect::<Vec<_>>();
如果出现错误,
ok()
将返回 None
然后被过滤掉。
Ok(T)
值被转换为原始T
。所以最后,你会得到一个Vec<T>