【问题标题】:Best way to check if Option contains a specific Some value?检查 Option 是否包含特定 Some 值的最佳方法?
【发布时间】:2019-08-01 22:26:35
【问题描述】:

你不能这样做:

if option.is_some() && option == 1 {
    // ...
}

因为如果option.is_some() == false 第二次比较会出错。

做这样的事情最好的方法是什么?

我现在在做什么:

if option.is_some() {
    if option == 1 {
        // ...
    }
}

【问题讨论】:

    标签: rust optional


    【解决方案1】:

    模式匹配是一个强大的工具,使用它!代替常规的if,使用if let

    if let Some(1) = option {
        // --snip--
    }
    

    有关模式匹配的更多信息,请咨询The Rust Reference

    【讨论】:

    • 我以前(在我在问题中给出的版本之前)使用的是 match 关键字,例如 pastebin.com/dk1n48Lb 。我想这做同样的事情但更优雅? if let 也可以用于> 比较吗?
    • @JonathanWoollett-light in The Book 有一个很好的解释 if let,什么时候使用它而不是 match 或者什么时候更喜欢后者而不是前者,an entire dedicated chapter
    • 我根据上面的评论进行了编辑,不确定您是否看到我的编辑(对此感到抱歉)询问if let 是否可以与> 或类似条件一起使用。
    • @JonathanWoollett-light 很好,您可以使用Some(0..=3) 甚至Some(12..=<T as MaxValue>::MAX) 之类的模式(或者根据类型和您的比较<> 使用MIN) .您还可以使用match 和额外的if 过滤器作为其模式的一部分,甚至可以使用if option.map_or(false, |i| i > 2)。查看我在答案中链接的参考资料。
    • @JonathanWoollett-light simple play.rust-lang.org/…
    【解决方案2】:

    模式匹配是正确的解决方案,但如果你想要一个bool,你可以使用相等运算符:

    fn main() {
        let maybe_int = Some(123);
        let contains_123: bool = maybe_int == Some(123);
    
        assert!(contains_123);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2014-06-12
      • 2013-08-15
      • 2011-06-04
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多