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

zqdjd7g9  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(124)

有没有可能匹配一个动态变量,而不仅仅是字面量?
在这段代码中,第一个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!()
    // };
}

字符串

xcitsw88

xcitsw881#

您可以使用 * 匹配后卫 *。

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

字符串

g6baxovj

g6baxovj2#

在Rust中是否有可能匹配一个动态变量
不可以。顾名思义,* 模式匹配 * 基于 * 模式 *,而不是 * 表达式 * 或 * 值
你可以从the grammar看到这一点:一个 MatchArmOuterAttribute Pattern MatchArmGuard?
,而a pattern is an enumerated set of specific constructs。大部分是文字、标识符、路径和合并组合它们的方法(结构、元组、切片.模式)。

llycmphe

llycmphe3#

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

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表达式不能在模式中使用。由于语法原因,中间的NUMBERS0NUMBERS1常量是必要的。=>的左边不是表达式,而是模式。有些模式看起来像表达式,但不是所有表达式都有模式外观。

58wvjzkj

58wvjzkj4#

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

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

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

字符串

相关问题