【问题标题】:Idiomatic way to only get insides of `Some` from a vector of options?只从选项向量中获取“Some”内部的惯用方法?
【发布时间】:2022-01-15 12:41:33
【问题描述】:

我正在学习 Rust,并试图习惯使用 Results 和 Options。给定一个向量。如果我只想要没有错误的结果(或者Option 没有错误的结果),有没有比下面更优雅的方法,或者这与我通常必须编写的样板数量有关?

我意识到在map 中可以做更多的事情,比如unwrap_or_elsepartition 好结果远离坏结果。


    let optvec   = vec![Some(1), None, Some(4), None];
    let filtered = optvec.iter()
    .filter(|q| q.is_some())
    .map(|q| q.unwrap())
    .collect::<Vec<i32>>();

【问题讨论】:

标签: vector rust iteration


【解决方案1】:

您可以使用 filter_map 它只返回 Somes 而不是 Nones。

let optvec   = vec![Some(1), None, Some(4), None];
let filtered: Vec<i32> = optvec.iter().filter_map(|f| *f).collect();
println!("{:?}", filtered);
>>> [1, 4]

【讨论】:

  • 你也可以只使用.flatten(),因为Option&lt;T&gt;也实现了Iterator&lt;Item=T&gt;
【解决方案2】:

在您的情况下,由于您没有进行任何映射,我建议使用flattening 而不是filter_maping。 在我看来,这更清晰,更不言自明。

    let optvec = vec![Some(1), None, Some(4), None];
    let filtered: Vec<i32> = optvec.iter().flatten().cloned().collect();
    assert_eq!(filtered, &[1, 4]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多