为什么 "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
没有模式限制,所以它总是匹配;变量 Modify
和 Delete
未使用。
正如您自己发现的那样,您需要使用 Phase::Add
,而不是 Add
。
当我写一个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
没有模式限制,所以它总是匹配;变量 Modify
和 Delete
未使用。
正如您自己发现的那样,您需要使用 Phase::Add
,而不是 Add
。