Rust快速学习开发(三)-数据类型

172 阅读5分钟

Rust 数据类型

Rust 是一种静态类型语言,这意味着所有变量的类型必须在编译时已知。这有助于 Rust 避免许多类型相关的错误,提高代码的安全性和性能。 Rust 中的两个数据类型子集:标量和复合。

如果不知道类型就会报错, 如果不像下面的代码这样添加类型注解 : u32,Rust 会显示错误 例

    let number:u32="42".parse().expect("not a number!");
    println!("number of is :{number}");

1.标量类型

rust有四种标量类型:整型,浮点型,布尔型
标量类型是指单个值的类型,它们没有内部结构或组件。Rust 有四种标量类型:整型,浮点型,布尔型和字符型。

整型

长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize
  • 每一个变体都可以是有符号或者无符号的,并有一个明确的大小,有符号和无符号代表数字能否为负值,有负数(有符号数),永远为正(无符)
  • 存储计算:每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。
  • isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的,可以使用如下表格中的任何一种形式编写数字字面值。
数字字面值例子
Decimal (十进制)98_222
Hex (十六进制)0xff
Octal (八进制)0o77
Binary (二进制)0b1111_0000
Byte (单字节字符)(仅限于u8)b'A'

浮点型

浮点型是表示小数的类型,它们可以用来表示近似值或科学计算。Rust 有两种原生浮点数类型:f32 和 f64。默认值为 f64,因为它在现代 CPU 上几乎与 f32 一样快,但精度更好。所有的浮点数都是有符号的 浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。

       let x=2.0;//f64
       let y:f32=3.0;//f32

布尔型

布尔型是表示逻辑值的类型,它们只有两个可能的值:true 和 false。布尔型通常用于条件判断或控制流程。

       let f:bool=false;

字符型

字符型是表示单个 Unicode 字符的类型,它们可以用来表示文本或符号。Rust 中的 char 类型是最原始的字母类型。它的大小为四个字节,并表示一个 Unicode 标量值。

      let c='z';
      let z:char='Z';
      let heart_eyed_cat='h';

Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值,不过,“字符” 并不是一个 Unicode 中的概念

2.复合类型

复合类型是指将多个值组合成一个类型的类型,它们可以用来表示更复杂的数据结构。Rust 有两种原生复合类型:元组(tuple)和数组(array)

元组

元组是一种将多种不同类型的值组合成一个复合类型的方式。元组可以用圆括号和逗号来创建,并可以用索引或模式匹配来访问其中的元素。元组的长度一旦声明就固定了。元组长度固定:一旦声明,其长度不会增大或缩小。

2.1.1 元组定义
    let tup:(i32,f64,u8)=(500,6.4,1);
2.1.2 元组元素访问

tup变量绑定到整个元组上,因为元组是一个单独的复合元素,为了从元组汇总获取单个值,用匹配来解构元组值,例

      let (x,y,z)=tup;//解构
      println!("of z is:{z}");//1

元组使用(.)后跟值的索引来直接访问它们,例

     let x:(i32,f64,u8)=(-500,6.4,100);
    let x1=x.0;
    let x2=x.1;
    let x3=x.2;
    println!("x元组使用.赋值分别为:x1={x1},:x2={x2},:x3={x3}");//x元组使用.赋值分别 为:x1=-500,:x2=6.4,:x3=100

数组

数组是一种将多个相同类型的值组合成一个复合类型的方式。数组可以用方括号和分号来创建,并可以用索引或迭代器来访问其中的元素。数组在内存中是连续存储的,并且长度一旦声明就固定了。

2.2.1 数组定义

与元组不同,数组中包含的值必须相同,rust中数组与一些其他语言数组不同,rust中数组长度是固定的。如果不需要长度固定需要使用vector

      let a=[1,2,3,4,5,6];//数组,长度固定,类型统一

也可以像这样编写数组类型,在方括号中包含每一个元素的类型,后跟分号,在跟数组元素的数量

      let b:[i32;5]=[1,2,3,4,5];//i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。
2.2.2 访问数组元素

数组可以在栈上分配已知固定大小的单个内存块,可以使用索引来访问数组的元素

      let first=a[0];
      let second=a[1];
2.2.3 无效的数组访问

程序在索引操作中使用一个无效的值时导致 运行时 错误。程序会带着错误信息退出,例

     let mark=a[10];//let mark=a[10]; index out of bounds: the length is 6 but the index is 10