匹配具有Struct::default()值的枚举/错误:预期的元组结构或元组变体,找到关联的函数"A::de



我想匹配具有结构值的枚举。当我匹配枚举时,似乎需要为enum字段提供一个值(如果它有值的话(。我想将此值设置为A::default((,并引用此默认值的值,但这会导致错误:expected tuple struct or tuple variant, found associated function `A::default。我该如何解决这个问题?游乐场

use std::default::Default;
struct A {
val_1: i32,
val_2: i32,
val_3: Vec<String>,
}
impl Default for A {
fn default() -> A {
A {
val_1: 0,
val_2: 0,
val_3: vec!["Hello".to_string()],
}
}
}
struct B {
val_1: i32,
val_2: i32,
val_3: A,
}
impl Default for B {
fn default() -> B {
B {
val_1: 0,
val_2: 0,
val_3: A::default(),
}
}
}
enum Ops {
OpA { config: A },
OpB { config: B },
}
struct Mast {
pub OpType: Ops,
}
fn main() {
let myop = Mast {
OpType: Ops::OpA {
config: A::default(),
},
};
match myop.OpType {
Ops::OpA{ config: A::default() } => {
println!("{}", "got OpA"),
println!("{}", A::default().val_1),
}//<--'expected tuple struct or tuple variant, found associated function `A::default`'
Ops::OpB{ config: B::default() } => println!("{}", "got OpB"),
}
}

您不关心结构字段值,所以使用..忽略值:

match myop.OpType {
Ops::OpA {..} => println!("{}", "got OpA"),
Ops::OpB {..} => println!("{}", "got OpA"),
}

如果你想把config字段提取到一个变量中,比如说foo,那么你可以这样做:

match myop.OpType {
Ops::OpA {config: foo} => println!("OpA: {}", foo),
Ops::OpB {config: foo} => println!("OpB: {}", foo),
}

这也是旧代码不起作用的原因:因为模式匹配将模式提取到变量中,并且它不会检查值是否相等。

如果你想变异它,那么用ref:匹配它

match myop.OpType {
Ops::OpA {config: ref mut foo} => *foo = A::default(),
Ops::OpB {config: ref mut foo} => *foo = B::default(),
}

这将要求myop也是mut。还有一个简写{config},它将扩展到{config: config}:

match myop.OpType {
Ops::OpA {ref mut config} => *config = A::default(),
Ops::OpB {ref mut config} => *config = B::default(),
}

另请参阅:

  • 铁锈语言:模式语法
  • Rust参考:模式

最新更新