使用元组元素进行匹配语句比较时出错
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:枚举
第三个解决方案,也是您可能 打算 通过定义 sky
和 temperature
变量来实现的解决方案,是使用 enum
s.
但正如之前一样,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
特性以将字符串转换为枚举值。
我正在尝试将两个变量与元组的元素进行匹配,但我不确定这里的错误是什么。
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:枚举
第三个解决方案,也是您可能 打算 通过定义 sky
和 temperature
变量来实现的解决方案,是使用 enum
s.
但正如之前一样,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
特性以将字符串转换为枚举值。