文章目录
2. Rust 基础入门
2.2. 基本类型
2.2.2. 字符、布尔、单元类型
字符类型(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 个字节:
fn main() {
let x = '中';
println!("字符'中'占用了{}字节的内存大小",std::mem::size_of_val(&x));
}
输出如下:
$ cargo run
Compiling ...
字符'中'占用了4字节的内存大小
注意,我们还没开始讲字符串,但是这里提前说一下,和一些语言不同,Rust 只能用
''
来表示字符,""
是留给字符串的。
布尔(bool)
Rust 中的布尔类型有两个可能的值:true
和 false
,布尔值占用内存的大小为 1
个字节:
fn main() {
let t = true;
let f: bool = false; // 使用类型标注,显式指定f的类型
if f {
println!("这是段毫无意义的代码");
}
}
使用布尔类型的场景主要在于流程控制,例如上述代码的中的 if
就是其中之一。
单元类型()
(无值、空值)
单元类型就是
()
,对,你没看错,就是()
,唯一的值也是()
,一些读者读到这里可能就不愿意了,你也太敷衍了吧,管这叫类型?只能说,再不起眼的东西,都有其用途,在目前为止的学习过程中,大家已经看到过很多次
fn main()
函数的使用吧?那么这个函数返回什么呢?没错,
main
函数就返回这个单元类型()
,你不能说main
函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:发散函数( diverge function )
,顾名思义,无法收敛的函数。例如常见的
println!()
的返回值也是单元类型()
。再比如,你可以用
()
作为map
的值,表示我们不关注具体的值,只关注key
。 这种用法和 Go 语言的 struct{} 类似,可以作为一个值用来占位,但是完全不占用任何内存。
Rust 中的单元类型(Unit Type)用一对空括号 ()
表示,代表一个零长度的元组(tuple)。单元类型只有一个可能的值,也用 ()
表示。
单元类型的用途
1. 表示无返回值的函数
在 Rust 中,如果函数不返回任何有意义的值,那么它默认返回单元类型 ()
。这类似于其他语言中的 void
类型。
fn do_something() {
// 该函数实际返回了单元类型 `()`
}
2. 占位符
当需要一个类型但不关心其具体值时,可以使用单元类型作为占位符。例如,在泛型编程中,单元类型可以作为默认类型参数。
3. 实现特定的 Trait
如果你想为某个类型实现某个 trait,但又不需要存储任何数据,可以使用单元类型。
struct MyStruct;
impl SomeTrait for MyStruct {
// 实现 trait 的方法
}
4. 控制流程结构:
在一些控制流程结构中,如 if
或 match
表达式,需要返回一个值时,可以使用单元类型。
// 测试代码
fn main() {
let condition = true;
let _result = if condition {
// 做点什么
} else {
()
};
}
示例
fn main() {
let x: () = (); // x 的类型是单元类型
println!("x 的值是 {:?}", x); // 输出:x 的值是 ()
}
总结
单元类型在 Rust 中用于表示“无值”或“空值”,在函数返回类型、泛型占位符和控制流程中起到重要作用。它确保了 Rust 的类型系统的统一性,即使在没有实际值的情况下,也有一个明确的类型。