【问题标题】:Pattern match on enum type don't care about arguments枚举类型的模式匹配不关心参数
【发布时间】:2022-12-07 11:24:31
【问题描述】:
enum Foo {
  Bar(usize, usize),
  Baz(isize),
}

impl Operator {
    fn value(&self) -> usize {
        use Foo::*;
        match (self) {
            Bar(_) => 1,
            Baz(_) => 2,
        }
    }
}

Bar(_)BarBar() 都不起作用。

我只想对枚举类型进行模式匹配,参数根本不重要。我宁愿不必记住我需要为每个枚举变体放置多少个 _,也不必在枚举定义更改的情况下更改这些模式。

【问题讨论】:

    标签: rust pattern-matching


    【解决方案1】:

    由于 Bar 必须要有参数,所以您要么必须同时匹配它们:

    match self {
           Bar(_, _) => 1,
           Baz(_) => 2,
    }
    

    或使用..

    match self {
        Bar(..)
        Baz(_) => 2,
    }
    

    【讨论】:

    • 看起来 (..) 可能正是我所追求的。希望它没有任何性能成本。
    【解决方案2】:

    要在代码中对 Foo 枚举类型进行模式匹配,您可以在 value 方法中为 Baz 变体添加匹配模式。您还可以更新 Bar 变体的匹配模式以包括解构,以便提取元组中的值。

    下面是一个示例,说明如何更新代码以模式匹配 Foo 枚举类型:

    enum Foo {
      Bar(usize, usize),
      Baz(isize),
    }
    
    impl Operator {
        fn value(&self) -> usize {
            use Foo::*;
            match (self) {
                // Add destructuring to extract the values in the tuple
                Bar(x, y) => 1 + x + y,
                // Add a match pattern for the Baz variant
                Baz(_) => 2,
            }
        }
    }
    

    在此修改后的代码中,value 方法现在具有 Baz 变体的匹配模式,因此它可以处理 Foo::Baz 值。它还使用解构来提取 Bar 变体的元组中的值,并将这些值添加到方法的返回值中。这允许 value 方法模式匹配 Foo 枚举类型并处理两个变体的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      相关资源
      最近更新 更多