首页 / Rust 入门教程 / 布尔与字符类型

Rust 入门教程

布尔与字符类型

本教程共 78 篇 · 第 10 篇 · 更新于 2026-08-08 · 约 6 分钟阅读

RustRust 入门教程boolchar布尔字符Unicode单引号

本节目标:掌握 Rust 的两个”小”标量类型——布尔 bool 和字符 char,重点理解 char 是 Unicode 而非单字节,避免和字符串、字节混淆。

整数和浮点数讲完了,标量类型还剩两位:布尔和字符。它们看着简单,但 char 在 Rust 里有个反直觉之处,值得单独拎出来说。

10-1 布尔类型 bool

布尔只有两个值:truefalse。它占 1 个字节,用来表达”是/否""开/关”这类二选一状态:

fn main() {
    let is_ready = true;
    let has_error: bool = false;
    println!("准备好了吗:{is_ready}");
}

布尔最常见用在条件判断里(if 后面跟的表达式就得是 bool)。Rust 不允许”非零即真”那种宽松写法——别的语言里 if (x) 只要 x 不是 0 就当作真,Rust 必须明明白白是 true / false

Warning

从 C/Python 转来的人注意:Rust 的 if 条件必须是 bool 类型。写 if x { }(x 是整数)会直接编译报错,你得写成 if x != 0 { }。这种严格反而帮你少出逻辑 bug。

10-2 布尔的来历

布尔值通常来自比较运算:

let a = 10;
let b = 20;
let bigger = a > b; // bigger 是 bool,值 false

><==!= 这些比较符的结果都是 bool。多个条件还能用 &&(且)、||(或)、!(非)组合,这部分留到控制流章节细讲,这里先认识 bool 长啥样。

10-3 字符类型 char

字符用 char 表示,字面量用单引号包一个字符:

let c = 'z';
let zh = '中';
let heart = '❤';

注意是单引号 ',不是双引号。双引号包的是字符串(后面章节讲),单引号包的是单个字符。这点和很多语言一致,但也正因为一致,容易让人低估 char 的水深。

10-4 关键:char 是 Unicode,占 4 字节

这是本章最重要的点。在 C 语言里,char 就是 1 个字节,只能装 ASCII(英文字母、数字、符号)。Rust 的 char 完全不同:它代表一个 Unicode 标量值,固定占 4 个字节(32 位)

这意味着一个 char 能装下世界上几乎任何书写系统的字符:

let latin = 'A';     // 拉丁字母
let han = '汉';      // 汉字
let emoji = '🚀';    // 火箭 emoji 也能放进单个 char
Note

因为 Unicode 涵盖百万量级的码位,4 字节才装得下。所以 Rust 的 char 不是”一个字节”,存一个汉字和存一个英文字母占的内存一样(都是 4 字节)。这和 Java 的 char、Python 的 str 设计理念类似,但跟 C 的 char 天差地别。

10-5 char 不是字符串,也不是 u8

新手两大坑:

  1. 把 char 当字符串用。 '中' 是 char,"中" 是字符串(即使只有一个字)。两者类型不同,不能混用。
  2. 以为 char 能当数字做算术。char 和 u8 不是一回事,想拿字符的 Unicode 码点要显式转换:'A' as u32 得到 65,但别随便把 char 当字节使。
Warning

处理”一个字符占几字节”时别想当然。Rust 的字符串在内存里是 UTF-8 编码(变长字节),但单独的 char 类型是 4 字节的 Unicode 码点。字符串的长度(字节数)和字符个数常常不相等,这点后面讲字符串时会再强调。

10-6 转义字符

char 和字符串都支持转义,用反斜杠 \ 开头:

let tab = '\t';     // 制表符
let newline = '\n'; // 换行
let quote = '\'';   // 单引号本身
let slash = '\\';   // 反斜杠本身

\n 换行和 \t 制表最常用。要在字符串里原样显示反斜杠或引号,就靠转义。

10-7 标量类型全家福

到这,四个标量类型齐了:

  • 整数:i8/u8 … i128/u128、isize/usize
  • 浮点:f32、f64
  • 布尔:bool(true/false)
  • 字符:char(Unicode,4 字节,单引号)

标量类型都是”单个值”。下一章我们看怎么把多个值打包在一起——复合类型之元组(Tuple),它能把不同类型的值装进一个整体。

Tip

记不住类型大小?写代码时大多数情况让编译器推断,只有涉及类型不匹配报错、或想精确控制内存(比如写底层、处理网络协议)时才手动标。新手别 premature optimization(过早优化)。

10-8 布尔与字符的实用小技巧

布尔和字符虽小,实际开发里有几个值得记的技巧。布尔最常见是当条件,但它本身也是值,可以存进变量、作为函数返回值:

fn is_even(n: i32) -> bool {
    n % 2 == 0
}
let ok = is_even(4); // ok 是 bool

字符方面,遍历一个字符串拿到的是 char(Unicode 字符),不是字节:

for c in "你好".chars() {
    println!("{c}");
}

这会正确打印两个汉字,而不是把 UTF-8 的字节拆开。再强调一遍前面提过的关键点:String 的长度(字节数)和 chars().count()(字符数)常常不同——“你好”的 len() 是 6(每个汉字 3 字节),但字符数是 2。处理文本时想清楚你要的是”字节”还是”字符”。

Warning

别用 for c in "你好" {} 直接遍历字符串——字符串默认按字节迭代,得到的是 u8 字节而非 char,遇到中文会出错。要字符就显式调 .chars()。这是 Rust 处理 Unicode 和很多语言不同的地方,务必记牢。

10-9 布尔驱动断言与测试

布尔在测试和断言里也频繁出现。比如 assert!(条件) 会在条件为 false 时让程序崩溃,常用于验证代码行为:

fn main() {
    let b = is_even(4);
    assert!(b); // b 为 true 才过关,否则 panic
}

assert_eq!(a, b) 则断言两个值相等。这些在写测试时极常用——你写一段逻辑,再用 assert! 声明”我期望它返回 true / 返回某值”,运行一测便知对不对。

Note

Rust 还有 debug_assert!,它只在 debug 构建里检查、release 构建里自动跳过,用来放”不该失败但你想防一手”的检查,不拖慢发布版性能。这和前面讲的 debug/release 差异是同一套思路。现阶段知道布尔能驱动断言即可。

10-10 字符编码的三层认知

字符编码是很多新手的盲区,值得建立三层认知。第一层 ASCII:最早只用 7 位表示英文字母数字符号,共 128 个,一个字节就够。第二层 Unicode:把全世界文字(含中文、emoji)收进一张超大”码表”,每个字符分配一个编号(码点)。第三层 UTF-8:Unicode 码点怎么存进字节的”编码方案”,它用 1~4 字节变长表示,英文占 1 字节、中文占 3 字节。

Rust 的 char 存的是 Unicode 码点(4 字节),字符串 String 在内存里是 UTF-8 字节序列。记住这层区别,你就不会困惑”为什么字符串长度和字符数不同""为什么按字节切会出乱子”。

Note

为什么 Rust 选 UTF-8 而不是固定宽度?因为 UTF-8 对英文极省空间、且和 ASCII 兼容(英文文本和老系统无缝对接)。代价就是”一个字符可能占多字节”,处理文本要按字符而非字节。这是现代语言的共识选择。

10-11 小结

标量类型四大家族齐了:整数、浮点、布尔、字符。char 是 Unicode、占 4 字节、用单引号,和 C 的字节字符完全不同;布尔只能是 true/false、且是 if 条件的硬性要求。记住字符串按字节算长度和按字符算可能不同。下一章看元组,把多个值打包。