为什么 "match" 与 Rust 中的确切代码不匹配?

why "match" didn't match exact code in Rust?

当我写一个Display impl for enum时,我写的代码没有enum Type,无论我在测试中给什么值,它总是匹配第一个,为什么?

我发现如果我指定类型Phase::Add,那么它可以成功,但是为什么?

这将无法通过测试:

#[derive(Clone, Debug)]
pub enum Phase {
    Add,
    Modify,
    Delete,
}

impl fmt::Display for Phase {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Add => write!(f, "Add"),
            Modify => write!(f, "Modify"),
            Delete => write!(f, "Delete"),
            _ => write!(f, "Unknown"),
        }
    }
}

#[test]
fn test_lifecycle_phase() {
    let mut phase = Phase::Modify;
    assert_eq!("Modify", phase.to_string());
    phase = Phase::Delete;
    assert_eq!("Delete", phase.to_string());
}

只有这样写才可以,为什么?

#[derive(Clone, Debug)]
pub enum Phase {
    Add,
    Modify,
    Delete,
}

impl fmt::Display for Phase {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Phase::Add => write!(f, "Add"),
            Phase::Modify => write!(f, "Modify"),
            Phase::Delete => write!(f, "Delete"),
            _ => write!(f, "Unknown"),
        }
    }
}

#[test]
fn test_lifecycle_phase() {
    let mut phase = Phase::Modify;
    assert_eq!("Modify", phase.to_string());
    phase = Phase::Delete;
    assert_eq!("Delete", phase.to_string());
}

这是一个常见的陷阱。这是因为 Add => ... 没有引用 Phase::Add 而是将 self 的值绑定到新变量 Add。名称 Add 只是巧合,但模式 Phase::Add 和(新)变量 Add 是完全不同的结构。由于变量 Add 没有模式限制,所以它总是匹配;变量 ModifyDelete 未使用。

正如您自己发现的那样,您需要使用 Phase::Add,而不是 Add