当前位置: 首页 > article >正文

【第三课】Rust变量与数据类型(二)

目录

前言

Vector

HashMap

其他


前言

上一课介绍了rust的变量和常见的数据类型,走马观花的看了一下rust常见的变量和数据类型,这些都是rust的基本语法,整理出来只是起一个引子的效果,基本语法多练习才可以熟练。这一课继续介绍rust中的容器类型Vector和HashMap,这也是在工作中使用频率非常高的。开发代码都是这些基本的数据结构加上流程控制完成业务需求,虽然有些枯燥,但这就是工作。

开始之前,我们依旧使用cargo init lesson3创建一个新项目来保存这节课的代码。

Vector

vector,可变数组,这里的可变是相对于Array而言的,rust中的数组是长度不可变的,但是vector是长度可变的,类似于java中的ArrayList。关于vec的定义和增删改查都在下面代码中写了demo和详细解释,特殊说明的,在最后几行我们使用了枚举和模式匹配,还记得上一课中我们提到的枚举么,我们使用get方法获取的结果是Option,在vscode中可以点开源码查看Option的定义,它就是我们以后高频使用的枚举之一,枚举和模式匹配搭配一起使用,用来解析Option中是否存在值。

fn main() {
    // 定义方式1
    let mut v1: Vec<i32> = Vec::new();

    // 定义方式2
    let mut v2: Vec<i32> = vec![1, 2, 3, 4, 5];

    // 定义方式3
    let mut v3: Vec<i32> = Vec::with_capacity(5);

    // 定义方式4
    let mut v4: Vec<i32> = vec![1; 5]; // [1,1,1,1,1]

    // 增加元素
    v1.push(1);

    // 删除元素,删除操作其实在任何工作场景中用的都很少
    // pop删除并返回vec的最后一个元素,返回值是一个Option,这个java/scala中的optional
    // 的含义一致,都是表示也许有也许没有的意思
    let last = v2.pop();

    // remove删除指定索引位置的元素,并将该元素后面的元素左移
    let idx0 = v2.remove(0);

    // 修改元素
    v1[0] = 2;

    // 查询元素
    println!("v1[0]={}", v1[0]);
    match v1.get(0) {
        Some(x) => println!("x={}", x),
        None => println!("nothing"),
    }
}

Option的源码如下:

pub enum Option<T> {
    /// No value.
    #[lang = "None"]
    #[stable(feature = "rust1", since = "1.0.0")]
    None,
    /// Some value of type `T`.
    #[lang = "Some"]
    #[stable(feature = "rust1", since = "1.0.0")]
    Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}

HashMap

映射表,也是在工作中使用频率极高的一种容器。用法在代码中,HashMap并没有像vec!一样的初始化方法,还记得加上感叹号是宏么,也许在后面我们学习到宏的时候,我们自己实现一个hashmap!,我自己都不确定能不能写到那时候,工作时间越久,越感觉世事无常,一切过往,皆是序章,但愿到时候还有机会和大家可以分享一下hashmap!。

use std::collections::HashMap;

fn main() {
    // 定义方式1
    let mut h1: HashMap<String, i32> = HashMap::new();

    // 定义方式2
    let mut h2: HashMap<String, String> = HashMap::with_capacity(5);

    // 增/改
    // insert 如果插入的key不存在,插入成功,返回None,如果插入的key存在,更新成功,返回旧值
    let r1: Option<i32> = h1.insert("a".to_string(), 1);
    match r1 {
        Some(x) => println!("x = {}", x),
        None => println!("r1 is None"),
    }
    let r2: Option<i32> = h1.insert("a".to_string(), 2);
    match r2 {
        Some(x) => println!("x = {}", x),
        None => println!("r2 is None"),
    }

    // 删
    // remove 成功返回旧值 不存在该key则返回None
    let r3 = h1.remove("a");
    match r3 {
        Some(x) => println!("x = {}", x),
        None => println!("r3 is None"),
    }

    // 查
    h1.insert("b".to_string(), 2);
    println!("h1[b]={}", h1["b"]);
    match h1.get("b") {
        Some(x) => println!("x = {}", x),
        None => println!("None"),
    }
}

其他

rust中还有一些别的容器类型,下图列举了rust的collections中的一些容器类型,大家可以在需要使用时自行学习了解

//! * Sequences: [`Vec`], [`VecDeque`], [`LinkedList`]
//! * Maps: [`HashMap`], [`BTreeMap`]
//! * Sets: [`HashSet`], [`BTreeSet`]
//! * Misc: [`BinaryHeap`]


http://www.kler.cn/a/398383.html

相关文章:

  • AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu
  • 3D意识(3D Awareness)浅析
  • 15-1.Java 网络编程之 InetAddress(InetAddress 常用静态方法、InetAddress 常用方法)
  • 【操作系统不挂科】<Linux进程概念(4)>选择题(带答案与解析)
  • 深入理解Flutter生命周期函数之StatefulWidget(一)
  • SpringMVC数据校验、数据格式化处理、国际化设置
  • java.sql.SQLException Parameter index out of range
  • Ubuntu下的Eigen库的安装及基本使用教程
  • 14.最长公共前缀
  • 基于Kafka2.1解读Consumer原理
  • memblock内存分配器
  • 智能算法助力衍生品市场投资分析:正大科技的量化模型应用
  • java组件安全
  • Scala入门基础(17.1)Set集习题
  • Kotlin深度面试题:协程、密封类和高阶函数
  • 计算机网络 (3)计算机网络的性能
  • React前端框架入门教程:从零开始构建一个简单的任务管理应用
  • 麒麟Server下安装东方通TongLINK/Q
  • 01.02、判定是否互为字符重排
  • 【c++篇】:二叉搜索树--有序存储与高效查找的关键
  • 谷歌新作:Unbounded开放世界RPG,AI定义无限游戏新纪元
  • git 常见冲突场景与解决方法
  • 5.11 ResNet
  • 【最新鸿蒙开发之性能优化——动态加载和延迟加载】
  • mac上使用docker搭建gitlab
  • 虚幻引擎 CEO 谈元宇宙:发展、策略与布局