代码之家  ›  专栏  ›  技术社区  ›  dade

在Rust中给定谓词的情况下,将Some转换为None的惯用方法是什么?

  •  1
  • dade  · 技术社区  · 1 年前

    我希望能够转换 Some None ,如果某个特定条件对于some中的值成立。

    例如,如果我有 Some(false) 它应该变成 没有一个 虽然 Some(true) 应保持为 有些(真的)

    我找到了一些方法。

    let value1: Option<bool> = Some(false);
    let value2: Option<bool> = Some(true);
    
    let result1 = value1.and_then(|inner| if inner == false { None } else { Some(inner) });
    let result2 = value2.and_then(|inner| if inner == false { None } else { Some(inner) });
    
    println!("{:?}", result1); // Prints "None"
    println!("{:?}", result2); // Prints "Some(true)"
    

    甚至这个

    let value1: Option<bool> = Some(false);
    let value2: Option<bool> = Some(true);
    
    let result1 = if let Some(false) = value1 { None } else { value1 };
    let result2 = if let Some(false) = value2 { None } else { value2 };
    
    println!("{:?}", result1); // Prints "None"
    println!("{:?}", result2); // Prints "Some(true)"
    

    环顾文档,我找不到一种更简洁的方法。

    有点像

    let value = Some(v).to_none_if(predicate)
    
    where value will be None, if predicate is true
    or value will remain Some(v) if predicate is false
    
    

    Rust中进行这种类型转换的最惯用方法是什么?

    1 回复  |  直到 1 年前
        1
  •  5
  •   Chayim Friedman    1 年前

    你要找的是 filter() ,尽管它的作用与您的要求相反:它转换为 None 如果谓词返回 false 。因此,您需要否定以下表达式:

    let v = option.filter(|&v| !(v == false));
    

    或者只是:

    let v = option.filter(|&v| v);