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

问题描述 投票:0回答:4

是否可以匹配动态变量而不仅仅是文字?

在此代码中,第一个

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!()
    // };
}
rust pattern-matching
4个回答
18
投票

您可以使用比赛守卫

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

6
投票

Rust 是否可以匹配动态变量

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

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


3
投票

不管其他答案怎么说,它可以做你想做的事,但是你需要为每种情况创建一个明确命名的常量。

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
常量是必需的。
=>
的左侧不是表达式而是模式。有些模式看起来像表达式,但并非所有表达式都具有相似的模式。


0
投票

首先计算值然后传递给

match

const numbers: [i8; 2] = [0, 1];
let current = 5;

let string = match numbers[current % 2] {
    0 => "even",
    1 => "odd",   
    _ => unreachable!()
};
println!("{}",string);
© www.soinside.com 2019 - 2024. All rights reserved.