Rust数据类型
Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型。
基本数据类型
Rust是一个强类型语言与js不同,我们在声明变量时就要指定该变量的类型,编译器必须在编译期知道我们所有变量的类型。当然大多时聪明的编译器可以自动推导类型,但为了保证代码质量和可读性建议还是定义好类型。
基本类型意味着它们往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),基本数据类型由以下组成:
- 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
- 字符串:字符串字面量和字符串切片 &str
- 布尔类型: true和false
- 字符类型: 表示单个 Unicode 字符,存储为 4 个字节
- 单元类型: 即 () ,其唯一的值也是 ()
整数类型
整数是没有小数部分的数字。之前使用过的 i32 类型,表示有符号的 32 位整数( i 是英文单词 integer 的首字母,与之相反的是 u,代表无符号 unsigned 类型)。下表显示了 Rust 中的内置的整数类型:
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8位 | i18 | u8 |
16位 | i16 | u16 |
32位 | i32 | u32 |
64位 | i64 | u64 |
128位 | i128 | u128 |
视计算机CPU类型而定 | isize | usize |
isize 和 usize 的主要应用场景是用作集合的索引。
整形字面量可以用下表的形式书写:
数字字面量 | 示例 |
---|---|
十进制 | 98_222 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
字节 (仅限于 u8) | b'A' |
对于整形来说,Rust默认使用i32
类型,例如let num = 11
,num
的类型为i32
浮点类型
浮点类型数字 是带有小数点的数字,在 Rust 中浮点类型数字也有两种基本类型: f32
和 f64
,分别为 32 位和 64 位大小。默认浮点类型是 f64,在现代的 CPU 中它的速度与 f32
几乎相同,但精度更高。
示例
rust
fn main() {
let x = 5.0; // f64
let y: f32 = 1.0; // f32
}
序列
Rust 提供了一个非常简洁的方式,用来生成连续的数值,例如 1...6,生成从 1 到 4 的连续数字,不包含 6 ;1...=6,生成从 1 到 5 的连续数字,包含 6,它的用途很简单,常常用于循环中:
rust
for i in 1..=6 {
println!("{}",i);
}
序列只允许用于数字或字符类型,原因是:它们可以连续,同时编译器在编译期可以检查该序列是否为空,字符和数字值是 Rust 中仅有的可以用于判断是否为空的类型。如下是一个使用字符类型序列的例子:
字符类型
字符可以把它理解为英文中的字母,中文中的汉字。Rust 的字符不仅仅是 ASCII,所有的 Unicode 值都可以作为 Rust 字符,包括单个的中文、日文、韩文、emoji 表情符号等等,都是合法的字符类型。关于Unicode参考文章
由于 Unicode 都是 4 个字节编码,因此字符类型也是占用 4 个字节:
Rust 的字符只能用 '' 来表示, "" 是留给字符串的。
rust
fn main() {
let x = '余';
println!("{}",std::mem::size_of_val(&x)); // 4
}
bool类型
Rust 中的布尔类型有两个可能的值:true
和 false
,布尔值占用内存的大小为 1 个字节:
fn main() {
let ok = true;
let pass: bool = false; // 使用类型标注,显式指定f的类型
if ok{
//.....
}
}
使用布尔类型的场景主要在于流程控制.
单元类型
单元类型可以理解为一个站位的类型。什么意思?main
函数大家都知道,这个函数返回什么呢?这种没有实际返回值的函数在Rust中称为"发散函数",例如println!()
也是一样。