摘要
Rust是一门强类型语言,其所有变量的类型,需要在编译时能够确定。
Rust中每一个值都具有特定的类型。数据类型明确了Rust可以对这些数据所做的操作。本篇文章讲解了Rust中内置的数值,元组和数组等基本类型。
数值类型包括整型、浮点型、布尔类型和字符类型,它们也被称为标量类型,即只表示一个值;元组和数组由于能够同时包含多个值,也被称为复合类型。
标量类型
整型
在Rust中,整型数据表示的是数值。根据长度不同,从一个字节到十六个字节,同时每种长度又分为有符号类型和无符号类型,如下表:
长度(字节) | 有符号 | 无符号 |
---|---|---|
1 | i8 | u8 |
2 | i16 | u16 |
4 | i32 | u32 |
8 | i64 | u64 |
16 | i128 | u8128 |
随系统 | isize | usize |
其中isize
和usize
的实际长度,取决于系统环境。在64位系统中,其长度为64位,即8个字节;在32位系统中,长度为32位,4个字节。
整型字面值
为了便于辨识整型字面值,可以在字面值中加入 _
用作数字之间的分隔,如:1_000_000
,_
所起的作用仅仅是方面代码的阅读,它与1000000
表示的相同的数值;另外除了字节字面值(即以0,1序列表示的数值),其他类型的整型字面值都可以加上类型说明符作为后缀以标识数值类型,如:255u8
, 1024i64
或者1024_i64
等。
一个数字,可以采用不同的进制表示,如十进制,十六进制,八进制和是二进制等。区分这些不同进制的数的方式是根据字面值所带的前缀,如下表:
字面值类型 | 示例 |
---|---|
二进制 | 0b100_0001 |
八进制 | 0o101 |
十进制 | 65 |
十六进制 | 0x41 |
字节 | b’A’ |
二进制的前缀是0b
,八进制是0o
,十六进制是0x
,如果没有前缀则是十进制数。表中最后还有一个字节字面值,可用于表示ASCII字符,它存储的是ASCII字符的十进制值。
整型字面值的默认类型是:i32
。
浮点型
浮点型有两种类型:f32
和f64
。f64
是浮点型字面值的默认类型。
浮点型同样可以在字面值后加上其类型作为后缀用于标识类型:3.1_f32
,1.2f64
等
布尔类型
布尔类型的类型标识符是:bool
,其有两种可能的值:true
或者false
。布尔类型长度为一个字节。
布尔类型一般用于逻辑判断。Rust不支持类型间的隐式转换,因此在所有进行逻辑判断的语句中,都必须显式使用布尔类型或者返回布尔类型的表达式。
字符类型
字符类型的类型标识符是:char
。Rust中一个字符类型占四个字节。它支持Unicode字符。
字符字面值使用单引号表示,区别于字符串字面值(使用双引号)。
let ch = 'A';
let nice = '\u{597d}'; // => 好
复合类型
Rust中有两种基本的复合类型:元组和数组。它们都具有可存放多个值,固定大小的特点。不同之处在于元组可存放不同类型的值,而数组中所有值类型必须一样。
元组
元组可以存放多个值,值之间可以是不同的类型。元组的长度是固定的,在编译时即确定,定义之后不能改变其长度。
let t: (i32,bool,f32) = (-233,true,3.14);
元组类型说明符的格式是在圆括号内,以逗号分隔每个值的类型:(T1,T2,...)
;值的声明方式也是在圆括号中按照类型的顺序排列值。(val1,val2,...)
。
访问元组元素
获取元组中单个值的方式有两种:
- 定义匹配变量,解构元组;
- 通过索引值访问;
let t = (123,true,3.14);
let (x,y,z) = t; // 变量匹配
let xi = t.0; // 索引访问
let yi = t.1;
let zi = t.2;
数组
数组用于存放固定数量、相同类型的值。其类型标识符为:[T;size]
。
数组的初始化方式有两种:
- 完整列出所有值
- 如果所有值初始值一样,可采用
[Val;size]
的方式将所有元素初始化成相同的值
let arr1: [i32; 3] = [1,2,3];
let arr2 = [4,5,6];
let arr3 = [100;3]; // 所有元素初始化成相同的值。
访问数组元素
和大多数语言一样,Rust中也采用索引方式访问数组元素。如果索引访问越界,编译时无法检测,但运行时越界访问会立即退出。