【问题标题】:How do I use an enum in an `if` statement when I don't care what value it contains?当我不关心枚举包含什么值时,如何在“if”语句中使用枚举?
【发布时间】:2017-12-15 01:04:06
【问题描述】:

我有一个枚举:

#[derive(PartialEq, Eq)]
enum Foo {
    A,
    B(usize),
}

我可以在涉及其他逻辑的if 语句中使用它,例如baz

fn bar(foo: &Foo, baz: bool) {
    if foo == &Foo::B(3) || baz {
        println!("Do stuff")
    }
}

但是,这不会编译:

fn bar(foo: &Foo, baz: bool) {
    if foo == &Foo::B(_) || baz {
        println!("Do stuff")
    }
}

当我不在乎 B 包含什么值时,如何在 if 语句中使用它?

【问题讨论】:

    标签: if-statement enums rust


    【解决方案1】:

    在这种情况下使用match 可能更容易:

    fn do_stuff() {
        println!("Do stuff")
    }
    
    fn bar(foo: &Foo, baz: bool) {
        match foo {
            &Foo::B(_) => do_stuff(),
            _ => {
                if baz {
                    do_stuff();
                }
            }
        }
    }
    

    或者使用if let:

    fn bar(foo: &Foo, baz: bool) {
        if let &Foo::B(_) = foo {
            do_stuff();
        } else {
            if baz {
                do_stuff();
            }
        }
    }
    

    我不确定您是否可以轻松地将其全部归为一个条件,这让您很遗憾地重复do_stuff

    【讨论】:

    • 您可以通过匹配 (foo, baz): link 来对 do_stuff() 进行重复数据删除。尽管您可能会或可能不会认为这更易于维护。
    • 是否有任何原因导致将来某个时候无法将if foo == &Foo::B(_) || baz { 添加到语言中?
    • @HiDefender 有一个问题:github.com/rust-lang/rfcs/issues/935
    【解决方案2】:

    你可以使用std::mem::discriminant:

    use std::mem::discriminant;
    
    #[derive(PartialEq, Eq)]
    enum Foo {
        A,
        B(usize),
    }
    
    fn main() {
        let to_test = Foo::B(123);
        let some_bool = true;
    
        if discriminant(&to_test) == discriminant(&Foo::B(0)) && some_bool {
            println!("Do stuff");
        }
    }
    

    如果你必须对此进行大量测试,我建议你为它实现一个方法:

    impl Foo {
        fn is_b(&self) -> bool {
            discriminant(self) == discriminant(&Foo::B(0))
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2012-10-26
      • 2020-11-24
      • 1970-01-01
      • 2016-01-04
      • 2016-04-22
      相关资源
      最近更新 更多