类型

类型是对二进制数据的一种抽象和约束,方便开发者辨识和使用。

类型分类

  • 动态类型:在运行时进行类型检查
  • 静态类型:在编译时进行类型检查
  • 强类型:不允许存在类型的隐式转换
  • 弱类型:允许类型的隐式转换

思考

  1. JS是什么类型的语言?
  2. Rust是什么类型的语言?

答案:
JS是在运行时检查变量类型的,并且JS是存在大量的隐式转化的,因此JS是动态弱类型语言
Rust是在编译期间就会进行类型检查,并且不允许隐式转换,因此Rust是静态强类型语言
C语言是在编译期间进行类型检查,但是C存在隐式转换,因此C是静态弱类型语言

标量类型

标量类型表示一个单独的值,Rust中有四种标量类型:

  • 整数
  • 浮点数
  • 布尔
  • 字符

    整数

    | 长度 | 有符号 | 无符号 | | —- | —- | —- | | 8bit | i8 | u8 | | 16bit | i16 | u16 | | 32bit | i32 | u32 | | 64bit | i64 | u64 | | arch | isize | usize |
  1. let number = 32; // 没有显示声明类型,默认为i32
  2. let number: u8 = 1;
  3. let number: i16 = 2;
  • 在声明整型的时候,Rust默认使用i32
  • isizeusize类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的。
  • 有符号整数的范围是: -( 2**n-1 ) ~ ( 2n-1 **)。 无符号整数范围是:0 ~ ( 2**n-1 **)。n是他们的bit位数

浮点数

浮点数类型分为两种:

  • f32
  • f64

后者精度更高,Rust中默认使用f64

  1. fn main() {
  2. let x = 2.0; // f64
  3. let y: f32 = 3.0; // f32
  4. }

字符

单个字符,类型为char,用单引号包裹(这里需要注意双引号包裹的是字符串&str
image.png

char类型大小为 4byte,采用的是Unicode编码,比ASCII码更丰富。

布尔值

Rust 中的布尔类型使用 bool表示:

  • true
  • false

    1. fn main() {
    2. let t = true;
    3. let f: bool = false; // 显式指定类型注解
    4. }

    复合数据类型

元组类型

元组类型就是将多个标量类型组合成一个复合类型。
元组类型一旦声明,那么它的长度就是固定的,不能增长也不能缩短

 let tup = (1, 2); // 元组类型定义

// 解构元组类型
let (a, b) = tup;
println!("{} {}", a, b);// 1 2

// 使用.索引的方式访问元组类型的值
println!("{} ", tup.0); // 1

Tips: 没有任何值的元组()是一种特殊的类型。(只有一个值也不能写成(1)这种形式-编译器会抛错)这种特殊类型被叫做单元类型(unit type),在Rust中当表达式没有返回值时,就会隐式返回的unit type

数组类型

数组是长度固定的,不能增长也不能缩小。
数组中的每个元素的类型需要保持一致。

这两个性质就和js中的数组完全不同

let arr = [1,2,3,4,5]

// 声明数组的类型和长度: [类型;长度]
let arr: [i8; 5] = [1, 2, 3, 4, 5];
// 直接定义出一个长度为5,每项都为3的数组 --> [3,3,3,3,3]
let arr = [3; 5];

数组是分配在堆栈上,长度已知的数据,所以数组访问时可以直接通过下标访问arr[0]
当下标超出数组长度时,会直接抛出错误。
image.png

panicRust中的术语,表示程序因为遇到错误而终止