概述
Rust内置的原生类型 (primitive types) 有以下几类:
- 数值类型:分为有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 以及浮点数 (f32, f64)。
- 布尔类型:有两个值true和false。
- 字符类型:表示单个Unicode字符,存储为4个字节。
- 字符串类型:最底层的是不定长类型str,更常用的是字符串切片&str和堆分配字符串String, 其中字符串切片是静态分配的,有固定的大小,并且不可变,而堆分配字符串是可变的。
- 数组:具有固定大小,并且元素都是同种类型,可表示为[T; N]。
- 切片:引用一个数组的部分数据并且不需要拷贝,可表示为&[T]。
- 元组:具有固定大小的有序列表,每个元素都有自己的类型,通过解构或者索引来获得每个元素的值。
- 指针:最底层的是裸指针const T和mut T,但解引用它们是不安全的,必须放到unsafe块里。
- 函数:具有函数类型的变量实质上是一个函数指针。
- 元类型:即(),其唯一的值也是()。
数值类型
整数类型
Rust支持的整数类型如下:
长度 | 有符号整数 | 无符号整数 |
---|---|---|
8 | i8 | u8 |
16 | i16 | u16 |
32 | i32 | u32 |
64 | i64 | u64 |
128 | i128 | u128 |
arch | isize | usize |
整数字面量可以使用前缀 0x、0o和0b 分别表示十六进制、八进制和二进制。为了让长数值更容易认读,可以在数字间插入下划线。比如,可以把最大的u32 值写成 4_294_967_295。在哪里插入下划线都无所谓,因此对于十六进制或二进制数值,也可以每 4 位插一个下划线,比如 0xffff_ffff。或者,也可以用下划线将数字与类型后缀分开,比如 127_u8。
浮点类型
Rust 支持 IEEE单、双精度浮点类型。遵循 IEEE 754-2008 标准,这些类型包含正、负无穷,区分正、负零,还有一个非数值(not-a-number)值:
fn main() {
let x = 2.0; // f64,Rust默认使用f64浮点类型
let y: f32 = 3.0; // f32
}
布尔类型
Rust中的布尔类型有两个可能的值: true 和 中的布尔类型使用 bool 表示。例如:
fn main() {
let t = true;
let f: bool = false; // 显式指定类型注解
}
Rust对bool值的使用比较严格:if和while等控制结构要求它们的条件必须是bool表达式,逻辑操作符&&和||同样也是如此。
字符类型
Rust的char类型的大小为4个字节,表示了一个Unicode字符。Rust使用char类型表示单个字符,但对字符串或文本流使用UTF-8编码。因此,String将其文本表示为一个UTF-8字节的序列,而不是字符的数组。Rust的char类型是语言中最原生的字母类型,例如:
fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = 'ᛀ';
}
Rust 还是提供了字节字面量(byte literal),即用类字符字面量表示的u8 值:b’X’ 表示 ASCII 编码的字符 X,它是一个 u8 值。比如,由于字符 A的ASCII 编码是 65,因此 b’A’ 等于 65u8。字节字面量中只能出现 ASCII 编码的字符。
复合类型
复合类型可以将多个值组合成一个类型。Rust 有两个原生的复合类型: 元组(tuple)和数组(array)。
元祖
元组(tuple)由 2 个、3 个、4 个……各种类型的值组成,而且每个元素都可以是一个不同的类型。元组的写法是把逗号分隔的元素序列放在一对圆括号里。元组长度固定:一旦声明,其长度不会增大或缩小。
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}
数组
另一个包含多个值的方式是 数组(array)。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组是固定长度的:一旦 声明,它们的长度不能增长或缩小。
fn main() {
let a: [i32; 5] = [1, 2, 3, 4, 5];
}
如果你希望创建一个每个元素都相同 的数组,可以在中括号内指定其初始值,后跟分号,再后跟数组的长度,如下所示:
let a = [3; 5];
数组是一整块分配在栈上的内存。可以使用索引来访问数组的元素。注意:Rust 要求数组索引必须是 usize 值。
指针类型
Rust语言包含3种指针类型:引用、Box(智能指针)和原始指针。
引用
Rust支持两种类型的引用:
- &T:不可变引用
- &mut T:可变引用
Box(智能指针)
Rust在堆上分配一个值的最简单方式就是使用Box,例如:
let t = (12, "eggs");
let b = Box::new(t); //在堆中分配一个元组
转移是Rust处理分配到堆上的值的根本方式。
原始指针
Rust包含两种原始指针类型:*const T和*mut T。
字符串类型
Rust 字符串就是 Unicode 字符序列,但它在内存中不是以 char 数组的形式存储的。事实上,字符串在内存中使用 UTF-8 可变宽度编码存储。字符串中的每个 ASCII 字符用 1 个字节存储,其他字符则占用多个字节。字符串字面量放在一对双引号中。需要使用反斜杠转义的情形跟 char 字面量相同:
let speech = "\"Ouch!\" said the well.\n";
与 char 字面量不同的是,在字符串字面量中,单引号无须转义,双引号需要转义。
字节字符串
字节字符串(byte string)就是带有前缀b的字符串字面量。字节字符串是u8值(即字节)的切片,不是Unicode 文本的切片:
let method = b"GET";
assert_eq!(method, &[b'G', b'E', b'T']);
字节字符串可以使用我们刚刚看到的所有字符串语法:可以跨多行、使用转义序列、使用反斜杠连接行。原始字节字符串以 br" 开头。字节字符串不能包含任意 Unicode 字符,只能是 ASCII和\xHH 转义序列。
相关参考
- 《Rust程序设计语言》
- 《Rust程序设计》