使用元组元素进行匹配语句比较时出错

Error while using tuple elements for match statement comparison

我正在尝试将两个变量与元组的元素进行匹配,但我不确定这里的错误是什么。

fn main() {

    let s = "cloudy";
    let t = "warm";
    
    let sky = ("cloudy", "sunny", "rainy");
    let temperature = ("warm", "cold", "freezing");

    match (s,t) {
        (sky.0, temperature.0) => println!("It's cloudy and warm"),
    }
}

根据 match expression documentation, the left side of a match expression needs to be a pattern.

遗憾的是,动态变量不算作模式。如果左侧有变量,模式匹配将尝试将数据解构为


解决方案 #1:If 语句

如果您绝对需要与动态变量匹配,我看到的唯一方法是使用 if 语句:

fn main() {
    let s = "cloudy";
    let t = "warm";

    let sky = ("cloudy", "sunny", "rainy");
    let temperature = ("warm", "cold", "freezing");

    if s == sky.0 && t == temperature.0 {
        println!("It's cloudy and warm")
    }
}

解决方案 #2:文字

如果要对字符串进行模式匹配,需要使用string literals.

此外,match 声明需要详尽无遗,也就是说,它必须涵盖所有可能性。因此,在您的情况下,实现该目标的最简单方法是使用 _ 模式来匹配之前未匹配的所有内容。

这也是不能在匹配模式中使用动态变量的原因之一:编译器还不知道这些变量的内容,因此无法检查匹配是否详尽。

fn main() {
    let s = "cloudy";
    let t = "warm";

    match (s, t) {
        ("cloudy", "warm") => println!("It's cloudy and warm"),
        _ => println!("It isn't cloudy and warm"),
    }
}

解决方案 #3:枚举

第三个解决方案,也是您可能 打算 通过定义 skytemperature 变量来实现的解决方案,是使用 enums.

但正如之前一样,match 语句需要详尽无遗,因此我们需要添加 _ 案例。

pub enum Sky {
    Cloudy,
    Sunny,
    Rainy,
}

pub enum Temperature {
    Warm,
    Cold,
    Freezing,
}

fn main() {
    let s = Sky::Cloudy;
    let t = Temperature::Warm;

    match (s, t) {
        (Sky::Cloudy, Temperature::Warm) => println!("It's cloudy and warm"),
        _ => println!("It isn't cloudy and warm"),
    }
}

如果您有字符串作为输入值,那么您当然可以为这些枚举实现 FromStr 特性以将字符串转换为枚举值。