跳转到内容

Rust if...else

if 让程序能够做决定:根据某个条件,执行这一段代码或者另一段代码。

fn main() {
let age = 20;
if age >= 18 {
println!("你可以投票");
}
}
▶ 动手试一试

有两点要注意,从其他语言转过来的人经常在这里栽跟头:

  • 条件两边不用加括号:写 if age >= 18,而不是 if (age >= 18)。
  • 条件必须是真正的 bool。if age(一个数字)无法编译,要写成 if age != 0 之类的形式。
fn main() {
let age = 15;
if age >= 18 {
println!("你可以投票");
} else {
println!("年龄还不够");
}
}
▶ 动手试一试
fn main() {
let score = 72;
if score >= 90 {
println!("等级:A");
} else if score >= 75 {
println!("等级:B");
} else if score >= 60 {
println!("等级:C");
} else {
println!("等级:F");
}
}
▶ 动手试一试

和你预想的一样,Rust 会从上到下依次检查每个条件,执行第一个满足条件的分支。

这是 Rust 能做、而很多语言做不到的事:if 可以产生一个值。也就是说,可以把它写在 let 的右边:

fn main() {
let age = 20;
let status = if age >= 18 { "成年人" } else { "未成年人" };
println!("{status}");
}
▶ 动手试一试

这和函数返回值的方式一样:每个分支里的值后面都不加分号。唯一的要求是,两个分支必须产生相同的类型(这里都是 &str)。

可以把一个 if 放进另一个 if 里。这样能用,但嵌套到两三层就很难读了。很多时候,可以改用逻辑运算符 &&(与)和 ||(或)把条件连起来:

fn main() {
let temperature = 22;
let is_raining = false;
// 嵌套:能用,但代码越来越往右缩进
if temperature > 15 {
if !is_raining {
println!("嵌套写法:出去散散步吧");
}
}
// 同样的检查,合成一个条件
if temperature > 15 && !is_raining {
println!("组合写法:出去散散步吧");
}
// 只要有一边为 true,|| 就为 true
if temperature < 0 || temperature > 35 {
println!("待在屋里吧");
} else {
println!("天气不错");
}
}

输出:

嵌套写法:出去散散步吧
组合写法:出去散散步吧
天气不错
▶ 动手试一试

如果内层代码块还要额外做点别的事,或者它有自己的 else,嵌套依然合理。但如果外层 if 唯一的作用就是“守住”内层,用 && 能更简洁地表达同样的意思。要检查一个数是否在某个范围内,写成 temperature >= 15 && temperature <= 25。Rust 不允许写 15 <= temperature <= 25。

设一个数 n = 7。把 if 当作表达式,让变量 kind 等于 "偶数" 或 "奇数",然后打印 7 是奇数。提示:当 n % 2 == 0 时,这个数是偶数。

查看答案
fn main() {
let n = 7;
let kind = if n % 2 == 0 { "偶数" } else { "奇数" };
println!("{n} 是{kind}");
}

输出:

7 是奇数
▶ 动手试一试

一家电影院的票价是:12 岁以下儿童 5 元,65 岁及以上 7 元,其他人 12 元。设 age 为 70,用一个 if / else if / else 表达式算出 price,然后打印 票价:7 元。提示:每个分支都必须返回一个数字,而且整个 if 的最后一个 } 后面要加分号。

查看答案
fn main() {
let age = 70;
let price = if age < 12 {
5
} else if age >= 65 {
7
} else {
12
};
println!("票价:{price} 元");
}

输出:

票价:7 元
▶ 动手试一试
  • if 条件 { ... }:不需要括号,条件必须是 bool。
  • 用 else if 串起更多检查,用 else 兜底。
  • 用 && 和 || 组合条件,而不是把 if 套在 if 里。
  • if 可以当作表达式来产生值:两个分支的类型必须一致,而且必须有 else。

小测验

1. Rust 的 if 条件有什么硬性要求?

2. 把 if 当作表达式和 let 一起用时,两个分支必须满足什么条件?

得分: 0 / 2