我在试着匹配一个枚举结构。这个枚举有不同的变体,有不同的(或没有)字段,例如:
enum Enum {
One {n : usize},
Two ,
} 我试图实现的匹配块如下所示:
match m {
Enum::One{n: special_value} => {
println!("it is special! {}", special);
}
Enum::One{n} => {
println!("not special: {}", n);
}
Enum::Two => {
println!("not special");
}
}如果我定义了let m = Enum::One{n: 3}和let special_value = 8,代码就会打印it is special! 3。这应该会打印not special: 3。
如果我将匹配块更改为(请注意,我将变量special_value变量更改为文字8 )
match m {
Enum::One { n: 8 } => {
println!("it is special!");
}
Enum::One { n } => {
println!("not special: {}", n);
}
Enum::Two => {
println!("not special");
}
}现在定义let m = Enum::One { n: 3 },它将打印为所需的not special: 3。
在我的实际项目中,我不能使用文字来匹配函数调用中作为变量的值。
对于这个豪宅,我可以使用这个匹配块(请注意,特例已被移除,并由一般情况下的if子句替换):
match m {
Enum::One { n } => {
if n == special_value {
println!("it is special! {}", special_value);
} else {
println!("not special: {}", n);
}
}
Enum::Two => {
println!("not special");
}
}是否可以在匹配中使用变量,还是强制使用if子句?原因何在?
发布于 2022-09-07 14:11:26
yes。您可以在匹配臂上添加if statements,而无需在匹配臂块中创建if块。
这对你有用吗?
enum Enum {
One {
n: usize
},
Two
}
fn main() {
let special_value = 123;
let m = Enum::One { n: 123 };
match m {
Enum::One { n } if n == special_value => println!("it is special! {}", special_value),
Enum::One { n } => println!("not special: {}", n),
Enum::Two => {
println!("not special");
}
}
}为我工作。
https://stackoverflow.com/questions/73634904
复制相似问题