学习笔记
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客
  • Rust中的变量
  • 数据类型
  • 函数
  • 控制流
  • 所有权
  • 结构体

数据类型

Rust中的数据类型有两类,一类是标量类型,一类是复合类型

标量类型

标量类型所占的内存空间是确定的,是最基本的数据类型,这些类型在C#中称为基类型

标量类型包含整形、浮点型、布尔型、字符型

与其他编程语言一样,Rust的整形和浮点型也包含不同大小的细分类型,但是在Rust中,并不是用int表是32位整形、long表示64位整形,而是使用更直观的位表示

长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

isize 和 usize是根据架构来的,32位架构是32位,64位架构是64位

浮点数与其他编程语言一样分为32位浮点和64位浮点,不过并不叫float和double,而是叫f32和f64

布尔类型与其他编程语言一样,都是true和false;字符型表示一个字符,不过Rust中的字符是Unicode字符,占四个字节

复合类型

复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array);还可以自定义类型

元组

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。

Rust中的元组和C#中的元组定义相似

let tup: (i32, f64, u8) = (500, 6.4, 1);

Rust中的元组还支持解构语法

let (x, y, z) = tup;

也可以通过.加索引值的方式访问元组中的值

println!("通过索引值访问元组的第二个元素: {tup.1}");

不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。

数组

数组中的每个元素类型必须相同,这与其他编程语言相同(排除掉已经不用的Object数组)。

声明数组的方式也是类似的,只是格式上有一点点不同

// 声明包含5个i32元素的数组,但是没有初始化,直接访问会编译报错
let a = [i32;5];

// 也可以直接提供具体的值声明一个数组,此时a也是一个包含5个元素的数组
let a = [1,2,3,4,5]

// 如果使用相同的元素初始化数组,可以在声明类型的地方替换为具体的值,后面元素数量的定义不变,会初始化为一个包含了指定数量,所有元素都初始化为提供的具体的值的数组
let a = [3;5];

访问数组中的元素使用对应的索引值

let a = [1, 2, 3, 4, 5];

let first = a[0];
let second = a[1];

程序在索引操作中使用一个无效的值时导致运行时错误

如果需要访问一个不确定是否会越界的数组,可以使用get访问,它会返回一个Option,不会出现运行时错误

列表(vector)

vector 允许我们一个挨着一个地储存一系列数量可变的值。vector与其他编程语言的List类似

新建一个vector

// 新建一个空vector
let v: Vec<i32> = Vec::new();

// 通过vec!宏创建含有指定元素的vector,泛型类型自动推断为i32
let v = vec![1, 2, 3];

// 新建空vector并向其中增加元素
let mut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
v.push(8);

访问vector则与访问数组类似,可以通过索引和get访问

let v = vec![1, 2, 3, 4, 5];

// 通过索引访问,如果不是合法的索引值,会导致运行时错误
let third: &i32 = &v[2];
println!("The third element is {third}");

// 通过get访问,返回一个Option,不会导致运行时错误
let third: Option<&i32> = v.get(2);
match third {
    Some(third) => println!("The third element is {third}"),
    None => println!("There is no third element."),
}

vector不能在拥有其中项的引用的同时增加元素

let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0];
// 编译器会报错,这是因为vector同其他编程语言一样,vector也是先申请一段空间以数组的方式保存,如果新增元素时容量不够,就申请一个更大的数组空间,将目前的元素复制过去
// 如果在持有项的引用时添加元素导致了扩容复制,则原来的引用地址就不再有效
v.push(6);

vector是泛型的,只能保存同一种类型,其他编程语言有非泛型List,但是Rust不提供,当有需要保存不同类型的元素在vector中的需求时,可以借助枚举类型,Rust的枚举类型非常特别,可以包含一个任意类型的值

字符串(string)

哈希map(hash map)

hashmap允许我们将值与一个特定的键(key)相关联。这是一个叫做 map 的更通用的数据结构的特定实现。

Last Updated:
Contributors: 吴俊城
Prev
Rust中的变量
Next
函数