假设我有以下枚举:

enum MyEnum {
  One(u64),
  Two(u64),
  Three(u64)
}

如果我有一个Vec<MyEnum>,并且我只想判断是否存在一种变量,而不关心它包含的值,有没有更好的方法来判断它,而不是求助于以下方法:

let my_enums: Vec<MyEnum> = vec![];
my_enums.push(MyEnum::One(1));
my_enums.push(MyEnum::Two(2));

let two_exists = my_enums.iter().any(|x| match x {
   MyEnum::Two(_) => true,
   _ => false,
});

变量中的值在后面很重要,但在这个判断中不是特别重要.要判断这个变体是否存在,感觉需要很多语法.

推荐答案

正如 comments 已经指出的那样:

  • 如果Two的属性(此后称为"二人组")很少重要,并且只在这一个位置判断,您可以直接在.any()-闭包中使用matches!.

  • 如果在许多站点判断了Twoness、One和/或Three,那么在MyEnum上有方法是惯用的,如果当前值是某个变量,其唯一的任务就是返回bool.也就是说,你会有MyEnum::is_one() -> bool,MyEnum::is_two() -> bool,等等.

enum MyEnum {
    One(u64),
    Two(u64),
    Three(u64),
}

impl MyEnum {
    fn is_two(&self) -> bool {
        matches!(self, Self::Two(_))
    }
}

fn main() {
    let mut my_enums: Vec<MyEnum> = vec![];
    my_enums.push(MyEnum::One(1));
    my_enums.push(MyEnum::Two(2));

    // More code at the site where The Twoness is checked
    assert!(my_enums.iter().any(|x| matches!(x, MyEnum::Two(_))));

    // The Twoness is more of an inheriant property of `MyEnum`,
    // more code in the `impl`, less code at the site where The
    // Twoness is checked.
    assert!(my_enums.iter().any(MyEnum::is_two))
}

Rust相关问答推荐

如何在不安全的代码中初始化枚举 struct

空字符串转换为Box字符串时是否分配?<>

什么样的 struct 可以避免使用RefCell?

Rust:跨多个线程使用hashmap Arc和rwlock

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

如何使用 list 在Rust for Windows中编译?

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

在铁 rust 中,如何一次只引用几件事中的一件?

使用Rust WASM读取文件

返回Result<;(),框<;dyn错误>>;工作

tokio::sync::broadcast::Receiver 不是克隆

Rust Axum 框架 - 解包安全吗?

在 Rust 中忽略 None 值的正确样式

在发布中包含 Rust DLL

str 和 String 的 Rust 生命周期

按下 Ctrl + C 时优雅地停止命令并退出进程

在 Rust 中实现资源消耗的安全包装器

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?

编写 TOML 文件以反序列化为 struct 中的枚举

如何在 Rust 中使用特征标志来捕获多行代码?