如何根据动态变量进行匹配



是否可以在动态变量上进行匹配,而不仅仅是文字?

在这个代码中,第一个match应该与注释掉的match做相同的事情(number[0]0number[1]1(:

const NUMBERS: [i8; 2] = [0, 1];
fn test() {
let current = 5;
let string = match current % 2 {
NUMBERS[0] => "even", // This does not work
NUMBERS[1] => "odd",  // This does not work
_ => unreachable!(),
};
// let string = match current % 2 {
//     0 => "even",
//     1 => "odd",
//     _ => unreachable!()
// };
}

您可以使用Match guards

let string = match current % 2 {
even if even == numbers[0] => "even",
odd if odd == numbers[1] => "odd",
_ => unreachable!()
};

在rust中是否可以匹配动态变量

否。顾名思义,模式匹配基于的模式,而不是表达式

你可以从语法中看到这一点:MatchArmOuterAttribute*Pattern MatchArmGuard,而模式是一组枚举的特定构造。主要是文字、标识符、路径以及组合这些内容的方法(结构、元组、切片…模式(。

不管其他答案怎么说,都可以随心所欲,但您需要为每种情况创建一个显式命名的常量。

const numbers: [i8; 2] = [
0, 1
];
fn test() {
let current = 5;

const NUMBERS0: i8 = numbers[0];
const NUMBERS1: i8 = numbers[1];
let string = match current % 2 {
NUMBERS0 => "even",   // This does not work
NUMBERS1 => "odd",    // This does not work
_ => unreachable!()
};
// let string = match current % 2 {
//     0 => "even",
//     1 => "odd",
//     _ => unreachable!()
// };
}

这只是因为您的表达式是const。在模式中不能使用非const表达式。由于语法原因,中间的CCD_ 9和CCD_。CCD_ 11的左侧不是一个表达式,而是一个模式。有些模式看起来像表达式,但并非所有表达式都有相似的模式。

首先计算值,然后传递给match

const numbers: [i8; 2] = [0, 1];
let current = 5;
let string = match numbers[current % 2] {
0 => "even",
1 => "odd",   
_ => unreachable!()
};
println!("{}",string);

最新更新