# 字符、布尔、元类型

这三个类型所处的地位比较尴尬，你说它们重要吧，有时候也是不可或缺，说它们不重要吧，确实出现的身影不是很多，而且这三个类型都有一个共同点：简单，因此我们统一放在一起讲。

## 字符类型(char)

字符，对于没有其它编程经验的新手来说可能不太好理解(没有编程经验敢来学Rust的绝对是好汉)，但是你可以把它理解为英文中的字母，中文中的汉字。

下面的代码展示了几个颇具异域风情的字符：
```
fn main() {
    let c = 'z';
    let z = 'ℤ';
    let g = '国';
    let heart_eyed_cat = '😻';
}
```

如果大家从部分陈旧的语言来，可能会大喊一声：这XX叫字符？是的，在Rust语言中这些都是字符，Rust的字符不仅仅是`ASCII`，所有的`Unicode`值都可以作为Rust字符，包括中文/日文/韩文，emoji表情等等，都是合法的字符类型。`Unicode` 值的范围从 `U+0000~U+D7FF`和 `U+E000~U+10FFFF`。不过“字符”并不是 `Unicode` 中的一个概念，所以人在直觉上对“字符”的理解和 Rust 的字符概念并不一致。

由于`Unicode`都是4个字节编码，因此字符类型也是占用4个字节：
```rust
fn main() {
    let x = '中';
    println!("字符'中'占用了{}字节的内存大小",std::mem::size_of_val(&x));
}
```

输出如下:

```console
$ cargo run
   Compiling ...
    
字符'中'占用了4字节的内存大小
```

> 注意，我们还没开始讲字符串，但是这里提前说一下，和一些语言不同，Rust的字符只能用`''`来表示,`""`是留给字符串的

## 布尔(bool)

Rust 中的布尔类型有两个可能的值：`true` 和 `false`, 布尔值占用内存的大小为 `1` 个字节：

```rust
fn main() {
    let t = true;

    let f: bool = false; // 使用类型标注,显式指定f的类型

    if f {
        println!("这是段毫无意义的代码");
    }
}
```

使用布尔类型的场景主要在于流程控制，例如上述代码的中的`if`就是其中之一。

## 元类型

元类型就是`()`，对，你没看错，就是`()`，唯一的值也是`()`，可能读者读到这里就不愿意了，你也太敷衍了吧，管这叫类型？

只能说，再不起眼的东西，都有其用途，在目前为止的学习过程中，大家已经看到过很多次`fn main()`函数的使用吧？那么这个函数返回什么呢？

没错，`main`函数就返回这个元类型`()`，你不能说`main`函数无返回值，因为没有返回值的函数在Rust中是有单独的定义的：`发散函数`,顾名思义，无法收敛的函数.

例如常见的`println!()`的返回值也是元类型`()`。

