如何根据动态变量进行匹配?
How do I match based on a dynamic variable?
是否可以匹配动态变量而不仅仅是文字?
在此代码中,第一个 match
应该与注释掉的 match
相同(number[0]
是 0
并且 number[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!()
};
is it possible in rust to match on a dynamic variable
没有。顾名思义,pattern-matching 基于 patterns,而不是 expressions 或 值.
您可以从 the grammar: a MatchArm is OuterAttribute* Pattern MatchArmGuard?, and a pattern is an enumerated set of specific constructs 中看到这一点。主要是文字、标识符、路径和组合它们的方法(结构、元组、切片、...模式)。
尽管其他答案怎么说,是可以做你想做的,但你需要为每种情况创建一个明确命名的常量。
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
表达式。
出于语法原因,中间 NUMBERS0
和 NUMBERS1
常量是必需的。 =>
的左边不是一个表达式而是一个模式。有些模式看起来像表达式,但并非所有表达式都具有相似的模式。
先计算值再传给match
const numbers: [i8; 2] = [0, 1];
let current = 5;
let string = match numbers[current % 2] {
0 => "even",
1 => "odd",
_ => unreachable!()
};
println!("{}",string);
是否可以匹配动态变量而不仅仅是文字?
在此代码中,第一个 match
应该与注释掉的 match
相同(number[0]
是 0
并且 number[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!()
};
is it possible in rust to match on a dynamic variable
没有。顾名思义,pattern-matching 基于 patterns,而不是 expressions 或 值.
您可以从 the grammar: a MatchArm is OuterAttribute* Pattern MatchArmGuard?, and a pattern is an enumerated set of specific constructs 中看到这一点。主要是文字、标识符、路径和组合它们的方法(结构、元组、切片、...模式)。
尽管其他答案怎么说,是可以做你想做的,但你需要为每种情况创建一个明确命名的常量。
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
表达式。
出于语法原因,中间 NUMBERS0
和 NUMBERS1
常量是必需的。 =>
的左边不是一个表达式而是一个模式。有些模式看起来像表达式,但并非所有表达式都具有相似的模式。
先计算值再传给match
const numbers: [i8; 2] = [0, 1];
let current = 5;
let string = match numbers[current % 2] {
0 => "even",
1 => "odd",
_ => unreachable!()
};
println!("{}",string);