前言

Rust是静态类型语言,在编译时就必须知道所有变量的类型。

两种方式确定类型:

  • 根据值及使用方式,编译器通常可以推断出我们想要用的类型;
  • 当多种类型均有可能时,必须增加类型注解;

如下代码,不加类型编译会报错。

1
let guess: u32 = "42".parse().expect("Not a number!");

标量类型

  • 整型
  • 浮点型
  • 布尔类型
  • 字符类型

整型

长度 有符号 无符号
8bit i8 u8
16bit i16 u16
32bit i32 u32
64bit i64 u64
arch isize usize

注意:

  • isize 和 usize 类型依赖运行程序的计算机架构,64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的。
  • 除 byte 以外的所有数字字面值允许使用类型后缀,例如 57u8。
  • 允许使用 _ 做为分隔符以方便读数,例如1_000。
  • 默认数字类型为i32

整型溢出

比方说有一个 u8 ,它可以存放从0-255的值。那么当你将其修改为 256 时会发生什么呢?

Rust的处理方式是根据运行模式来区分对待:

  • debug模式:检查溢出,溢出时编译会panic报错;
  • release模式:不检查溢出,256会变成1,257会变成2,以此类推;

浮点型

长度 类型
32bit f32
64bit f64

默认类型为f64;

布尔型

布尔类型使用bool表示:

  • true
  • fasle

字符型

Rust 的char类型代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,拼音字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值。

Unicode 标量值包含从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF 在内的值。

1
2
3
4
5
fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';
}

注意 char 由单引号指定,不同于字符串使用双引号。

复合类型

  • 元组(tuple)
  • 数组(array)

元组类型

使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。

元组声明:

  • 元组的类型格式为 (类型1, 类型2, ...),中间使用,逗号分隔;
  • 元组中的值位于圆括号内,逗号分隔的列表中;
1
let tup: (i32, f32, bool) = (123, 12.34, false);

如何取值:

  • 模式解构
1
2
3
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("y = {}", y);

程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,x、y 和 z,这叫做解构(destructuring)。

  • 索引
1
2
let tup = (500, 6.4, 1);
println!("{}, {}, {}", tup.0, tup.1, tup.2);

跟大多数编程语言一样,元组的第一个索引值是 0。

数组类型

另一个包含多个值的方式是 数组(array)。与元组不同,数组中的每个元素的类型必须相同。并且Rust 中的数组是固定长度的,一旦声明,它们的长度不能增长或缩小。

数组声明:

  • 数组的类型格式为 [类型; 数组长度],注意中间使用;分号分隔;
  • 数组中的值位于中括号内,逗号分隔的列表中;
1
let arr: [i32; 4] = [1, 2, 3, 4];

这里创建了一个长度为4,类型为i32的数组。

访问元素 和其他编程语言类型,Rust数组使用索引下标访问元素,从0开始。

1
2
let arr: [i32; 4] = [1, 2, 3, 4];
println!("{}, {}", arr[0], arr[1]);

下标越界 当访问超过数组长度的下标时会怎样的呢?

1
2
3
let arr: [i32; 4] = [1, 2, 3, 4];
let idx = 10;
println!("{}", arr[idx]);

运行结果:

1
2
3
4
5
Compiling learn_types v0.1.0 (/Users/****/www/rust_code/learn_types)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30s
     Running `target/debug/learn_types`
thread 'main' panicked at 'index out of bounds: the len is 4 but the index is 10', src/main.rs:45:16
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

可与看出,编译并没有产生任何错误,不过程序会出现一个运行时(runtime)错误并且不会成功退出。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic。