代码之家  ›  专栏  ›  技术社区  ›  K. Biermann

是否可以与“const fn”的结果匹配?

  •  2
  • K. Biermann  · 技术社区  · 6 年前

    我尝试过天真的方法

    fn main() -> Result<(), Box<std::error::Error>> {
        let num = 0;
        match num {
            u64::max_value() => println!("Is u64::max_value()"),
            _ => println!("Is boring")
        }
        Ok(())
    }
    

    但是失败了 expected tuple struct/variant, found method <u64>::max_value .

    除了 n if n == u64::max_value() => ... 我可以用哪个?

    1 回复  |  直到 5 年前
        1
  •  2
  •   mcarton    6 年前

    的左侧部分 => 必须是模式,并且很少有表达式也是有效的模式,这不是调用表达式的情况。但是命名常量可以匹配,因此可以执行以下操作:

    fn main() -> Result<(), Box<std::error::Error>> {
        let num = 0;
    
        const MAX: u64 = u64::max_value();
        match num {
            MAX => println!("Is u64::max_value()"),
            _ => println!("Is boring")
        }
        Ok(())
    }
    

    Link to playground

    这也有助于让编译器检查匹配是否详尽(哪些模式保护 don't ):

    const fn true_fn() -> bool { true }
    
    fn main() -> Result<(), Box<std::error::Error>> {
        let num = true;
    
        const TRUE: bool = true_fn();
        match num {
            TRUE => println!("Is u64::max_value()"),
            false => println!("Is boring")
        }
        Ok(())
    }
    

    Link to playground