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,所以很少需要显式写出类型。
布尔值通常来自比较
Section titled “布尔值通常来自比较”在真实的代码里,很少直接写 true 或 false,它们一般是比较出来的结果:
fn main() { let age = 20; let can_vote = age >= 18; println!("可以投票:{can_vote}");}输出:
可以投票:true在条件中使用布尔值
Section titled “在条件中使用布尔值”bool 最主要的用途,是决定 if 走哪个分支:
fn main() { let is_raining = true;
if is_raining { println!("带上伞"); } else { println!("伞放家里就行"); }}if 的详细用法在 if…else 一课里讲,这里只是让你先感受一下布尔值为什么重要。
组合布尔值与短路求值
Section titled “组合布尔值与短路求值”在运算符一课里,你已经见过 &&(与)、||(或)和 !(非)。关于它们还有一点要知道:一旦结果已经确定,它们就会提前停下。这叫作短路求值(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”);但如果这个值要等程序运行时才知道,程序就会直接崩溃。所以,要把“安全检查”放在左边。
1. 能坐过山车吗?
Section titled “1. 能坐过山车吗?”游乐园的某个项目规定:身高至少 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 年是闰年:true1900 年是闰年:falsebool只有两个值:true或false。- 比较运算(
==、<、>=等)会得到布尔值。 if的条件必须是真正的bool,数字和字符串不会被隐式转换。&&和||会短路:一旦结果确定,就跳过右边,所以要把安全检查放在左边。
小测验
1. 像 age >= 18 这样的比较,得到的是什么类型?
2. 在 Rust 里,能像某些语言那样,直接把 0 这样的整数当作 if 的条件吗?
3. 在 count != 0 && total / count > 10 中,如果 count 是 0,会发生什么?
得分: 0 / 3
- 数据类型 —《Rust 程序设计语言》:官方教程对
bool的简短介绍,和其他基本类型放在一起讲。 bool— 标准库文档(英文):bool的所有方法,比如then和then_some,等你准备好了再看。- Lazy boolean operators — The Rust Reference(英文):
&&和||跳过右边的确切规则。 - 原生类型 — 通过例子学 Rust:
bool和 Rust 其他内置类型放在一起介绍,附可运行的示例。