How to compare enum without pattern matching

前端 未结 3 793
旧时难觅i
旧时难觅i 2020-12-15 14:56

I want to apply filter on an iterator and I came up with this one and it works, but it\'s super verbose:

.filter(|ref my_struct| match my_struct         


        
相关标签:
3条回答
  • 2020-12-15 15:40

    You can use if let Some(x) = option { then } idiom with the same if let construct but without destructuring:

    if let Unknown = my_struct.my_enum { false } else { true }
    
    0 讨论(0)
  • 2020-12-15 15:53

    I'd use pattern matching, but I'd move it to a method on the enum so that the filter closure is tidier:

    #[derive(Debug)]
    enum Thing {
        One(i32),
        Two(String),
        Unknown,
    }
    
    impl Thing {
        fn is_unknown(&self) -> bool {
            match *self {
                Thing::Unknown => true,
                _ => false,
            }
        }
    }
    
    fn main() {
        let things = vec![Thing::One(42), Thing::Two("hello".into()), Thing::Unknown];
        for t in things.iter().filter(|s| !s.is_unknown()) {
            println!("{:?}", t);
        }
    }
    

    See also:

    • Compare enums only by variant, not value
    0 讨论(0)
  • 2020-12-15 15:57

    First, you can use PartialEq trait, for example, by #[derive]:

    #[derive(PartialEq)]
    enum MyEnum { ... }
    

    Then your "ideal" variant will work as is. However, this requires that MyEnum's contents also implement PartialEq, which is not always possible/wanted.

    Second, you can implement a macro yourself, something like this (though this macro does not support all kinds of patterns, for example, alternatives):

    macro_rules! matches(
        ($e:expr, $p:pat) => (
            match $e {
                $p => true,
                _ => false
            }
        )
    )
    

    Then you would use it like this:

    .filter(|ref my_struct| !matches!(my_struct.my_enum, Unknown))
    

    There is an RFC to add such a macro into the standard library, but it is still under discussion.

    0 讨论(0)
提交回复
热议问题