跳转到内容

Rust 布尔值

布尔值(boolean)是最简单的类型:它只有 true(真)和 false(假)两种取值。在 Rust 里它叫 bool,只要代码需要做判断,就会用到它。

fn main() {
let is_active = true;
let has_error: bool = false;
println!("已启用:{is_active},出错:{has_error}");
}
▶ 动手试一试

看到 true/false,Rust 几乎总能自己推断出这是 bool,所以很少需要显式写出类型。

在真实的代码里,很少直接写 true 或 false,它们一般是比较出来的结果:

fn main() {
let age = 20;
let can_vote = age >= 18;
println!("可以投票:{can_vote}");
}

输出:

可以投票:true
▶ 动手试一试

bool 最主要的用途,是决定 if 走哪个分支:

fn main() {
let is_raining = true;
if is_raining {
println!("带上伞");
} else {
println!("伞放家里就行");
}
}

if 的详细用法在 if…else 一课里讲,这里只是让你先感受一下布尔值为什么重要。

在运算符一课里,你已经见过 &&(与)、||(或)和 !(非)。关于它们还有一点要知道:一旦结果已经确定,它们就会提前停下。这叫作短路求值(short-circuit evaluation)。

  • 对于 a && b,如果 a 是 false,整个表达式必定是 false,Rust 根本不会去看 b。
  • 对于 a || b,如果 a 是 true,整个表达式必定是 true,Rust 根本不会去看 b。

这可不只是提速的小技巧。它让左边可以“保护”右边:

fn main() {
let count = 0;
let total = 50;
// count 是 0,所以 Rust 算完 `count != 0` 就停下,不会做除法。
let big_average = count != 0 && total / count > 10;
println!("平均值很大:{big_average}");
let is_weekend = true;
let has_homework = true;
// is_weekend 是 true,所以根本不会检查 `!has_homework`。
let can_relax = is_weekend || !has_homework;
println!("可以放松:{can_relax}");
}

输出:

平均值很大:false
可以放松:true
▶ 动手试一试

除以零会让程序崩溃。因为 count != 0 写在前面,而且结果是 false,所以除法根本不会执行。如果把两边调换(total / count > 10 && count != 0),除法就会先执行。在这个例子里,编译器甚至能直接发现问题并拒绝编译(“this operation will panic at runtime”);但如果这个值要等程序运行时才知道,程序就会直接崩溃。所以,要把“安全检查”放在左边。

游乐园的某个项目规定:身高至少 120 厘米可以玩,或者年满 8 岁并且有大人陪同也可以玩。设身高为 115、年龄为 9、with_adult = true,打印这个孩子能不能玩。提示:用括号把“年龄和大人陪同”这部分括起来。

查看答案
fn main() {
let height_cm = 115;
let age = 9;
let with_adult = true;
let tall_enough = height_cm >= 120;
let can_ride = tall_enough || (age >= 8 && with_adult);
println!("身高够了:{tall_enough}");
println!("可以玩:{can_ride}");
}

输出:

身高够了:false
可以玩:true
▶ 动手试一试

能被 4 整除但不能被 100 整除的年份是闰年,或者能被 400 整除的年份也是闰年。为 2024 算出布尔值 is_leap 并打印,再对 1900 做同样的事。提示:“能被 4 整除”就是 year % 4 == 0,你可以用第二个 let 遮蔽 year 和 is_leap。

查看答案
fn main() {
let year = 2024;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} 年是闰年:{is_leap}");
let year = 1900;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} 年是闰年:{is_leap}");
}

输出:

2024 年是闰年:true
1900 年是闰年:false
▶ 动手试一试
  • bool 只有两个值:true 或 false。
  • 比较运算(==、<、>= 等)会得到布尔值。
  • if 的条件必须是真正的 bool,数字和字符串不会被隐式转换。
  • && 和 || 会短路:一旦结果确定,就跳过右边,所以要把安全检查放在左边。

小测验

1. 像 age >= 18 这样的比较,得到的是什么类型?

2. 在 Rust 里,能像某些语言那样,直接把 0 这样的整数当作 if 的条件吗?

3. 在 count != 0 && total / count > 10 中,如果 count 是 0,会发生什么?

得分: 0 / 3