数据类型
-
rust的两种数据类型子集:标量类型和复合类型
-
rust是静态语言,这表明rust在编译时必须清楚的知道所有变量的类型
一 Scalar Types 标量类型
4种标量类型: 整型,浮点型,布尔型, 字符型
1. Integer Types 整型
整型类型分为有符号整型和无符号整型
Length | Signed | Range(-2n-1 to 2n-1 - 1) | Unsigned | Range(0 to 2n - 1) |
---|---|---|---|---|
8-bit | i8 | -27 ~ 27 -1 (-128 ~ 127) | u8 | 0 ~ 28 -1 (0 ~ 255) |
16-bit | i16 | -215 ~ 215 -1 | u16 | 0 ~ 216 -1 |
32-bit | i32 | -231 ~ 231 -1 | u32 | 0 ~ 232 -1 |
64-bit | i64 | -263 ~ 263 -1 | u64 | 0 ~ 264 -1 |
arch | isize | 取决于计算机类型的体系结构 | usize | 取决于计算机类型的体系结构 |
arch 类型的 isize和usize类型取决于程序运行的计算机类型:如果是64位体系结构,则为64位; 如果是32位体系结构,则为32位
除了字节字面量之外,所有的数字字面量都允许使用类型后缀,如57u8
, 此外可以使用_
作为可视分隔符。如: 1_000, 100_0000.
Number literals | Example |
---|---|
Decimal | 98_222 |
Hex | 0xff |
Octal | 0o77 |
Binary | 0b1111_0000 |
Byte(u8 only) | b’A’ |
如果我们不确定使用哪种类型的整型,一般rust会默认选择最优的类型:i32。这种类型运行速度最快,即使是64位的操作系统。而usize/isiz主要是在为某种集合建立索引的情况下使用。
2. Floating-Point Types 浮点型
-
rust主要有单精度浮点和双精度浮点这两种浮点类型, 分别是
f32
和f64
对应代表32位单精度和64位双精度。 -
rust默认使用f64, 虽然目前的CPU运行32位与64位浮点型的速度及无差别,但是64位能捕获更高的精度。
3. The Boolean Type 布尔类型
rust的布尔类型是: ture 和 false
4. The Character Type 字符类型
- char字符类型使用 单引号, string字符串使用的是 双引号
- rust的字符是Unicode编码。
二 Compound Type 复合类型
1. The Tuple Type 元组类型
- rust通过在圆括号内使用逗号分隔列表值来创建一个元组,元组内的每个元素的类型可以是不同的。
fn main() { let tup: (i32, f64, u8) = (500, 6.4, 1); }
类型注释是可选的。
-
元组解包 destruct:
fn main() { let tup = (500, 6.3, 1); let(x, y, z) = tup; println!("y is : {}", y); }
-
元组也可以通过
.
+ 下标索引的方式访问元组的元素:fn main() { let tup = (500, 6.4, 1); let x = tup.0; let y = tup.1; let z = tup.2; }
2. The Array Type 数组类型
-
rust通过在方括内使用逗号分隔列表值来创建一个数组,不同于元组,数组内的元素类型必须是一致的。
-
不同于其他编程语言,rust的数组的长度是固定的, 一旦声明过了,数组大小就不可再改变。
-
vector 向量类型是一个可变的数组,如果不确定使用数组还是向量,推荐使用向量,因为数组一旦声明,大小就不可修改。
-
通过**[索引]**访问数组元素:
fn main() { let a = [1,2,3,4,5]; let x = a[0]; let y = a[1]; }
-
数组的越界访问,编译器不会检查出错误,但运行时会报错退出。在程序试图通过下标访问一个元素时,rust会检查索引是否小于数组的长度,超出就会报错退出。这是rust安全性的一种体现。因为其他低级语言访问超出的下标可能会直接拿到内存中其他的数据。rust阻止了这一访问,保护了内存安全。