数据类型

标量和复合类型
Rust是静态编译类型,在编译时就必须知道所有变量的类型

  • 给予使用的值,编译器通常能推导出他的具体类型
  • 当可能的类型比较多(例如将String类型转换为整数的parser方法),就必须添加类型标注,否则编译会报错,例子:
  1. fn main() {
  2. // let x = "42".parse().expect("不是数字类型"); // 编译报错
  3. let x:u32 = "42".parse().expect("不是数字类型");
  4. println!("the value x is {}",x)
  5. }

标量类型

整数类型

  • 整数类型没有小数部分
  • 例如u32就是一个无符号的整数类型,占据32位空间 范围是 0 到 231 -1,有符号的则是以i开头
  • 每种长度都分为i 和 u
  • 有符号的i类型 取值范围位 -2n 到 2n-1 - 1
  • 无符号范围 0 到 2n - 1
  • isize 和 usize 的类型是由计算机的架构决定的,计算机是64位,就是64位的

类型:

Length Singed Unsinged
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

整数溢出

例如:u8的范围是0-255,如果把一个u8变量的值设置位256,则:

  • 在调试模式下编译:Rust会检测整数溢出,发生溢出则程序运行时会panic
  • 在发布模式下(-release)编译:Rust不会检查可能导致panic的整数溢出:
    • 溢出发生时,Rust会执行“环绕”操作: 256变成0、257变成1 但程序不会panic

浮点类型

  • Rust有两种浮点类型,f32和f64
  • Rust的浮点类型 IEEE-745 标准
  • f64是默认的类型,因为在现代cpu上,f64和f32速度差不多但精度更高

布尔类型

  • 两个值:true 和 false
  • 一个字节大小
  • 符号是bool

字符类型

  • Rust语言中char类型被用来描述语言中最基础的单个字符
  • 占用四字节大小
  • 是Unicode标量值,他可以表示的字符内容比ASCII 多得多:拼音、中日韩文、零长度空白字符、emoji

复合类型

  • 复合类型可以将多个值放到一个类型里面
  • Rust提供了两种基础的复合类型: 元组(Tuple)、数组

Tuple

  • Tuple可以将多个类型的多个值放在一个类型里面
  • Tuple的长度是固定的:一旦声明无法改变

创建Tuple

  • 在小括号里面,用逗号分开
  • Tuple中每个位置都对应一个类型,Tuple中各元素类型不必相同
  1. fn main() {
  2. let tup:(i32,f64,u8) = (500,6.4,1);
  3. println!("tup is {},{},{}",tup.0,tup.1,tup.2)
  4. }

Tuple取值

  • 点语法,如上述事例
  • 可以通过解构赋值来获取Tuple的值
  1. fn main() {
  2. let tup:(i32,f64,u8) = (500,6.4,1);
  3. let (x,y,z) = tup;
  4. println!("tup is {},{},{}",x,y,z)
  5. }

数组

  • 数组也可以将多个值放在一个类型里,但是每个元素类型必须相同
  • 数组的长度也是固定的

数组的用处

  • 如果想让你的数据存放在栈内存(stack)上,而不是堆内存(heap)上,或者想保证有固定数量的元素,这时候使用数组更好
  • Vector的长度可以改变,更灵活,当数组不适用时可以用 Vector ,Vector 由标准库提供

数组的声明

  • 数组类型声明的表现形式: [ 类型:长度 ]
  1. let a:[i32,5] = [1,2,3,4,5]
  • 特殊情况,数组的每个值都相同,则可以直接声明为 [ 值;长度 ]
  1. // let a:[i32,5] = [3,3,3,3,3]
  2. let a:[i32,5] = [3;5]