【第三课】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`]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java语言】异常处理

异常 异常&#xff1a;在Java中程序执行过程中发生不正常行为。异常为多种&#xff0c;有算数异常、数组越界异常、空指针异常等&#xff08;这些是比较常见的异常&#xff09;&#xff1b; 异常的体系结构&#xff1a; 数组越界异常: ArrayIndexOutOfBoundsException。空指…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…

深度剖析C++STL:手持list利剑,破除编程重重难题(上)

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;中的 list 容器是一个双向链表结构&#xff0c;它提供了高效的插入和删除操 作。与 vector 不同&#xff0c;list 中的元素不是连续存储的&#xff0c;因此可以在任何位置高效插入和删除元素&#xff0c;而无需移动其…

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…

Matlab实现白鲸优化算法优化随机森林算法模型 (BWO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法&#xff08;Beluga Whale Optimizer, BWO&#xff09;是一种受白鲸社会行为启发的新型群智能优化算法。该算法通过模仿白鲸群体中的合作和竞争机制来指导搜索过程&#xff0c;能够在复杂解空间中高…

c#基本数据类型占用字节长度/取值范围/对应.net类型

具体前往&#xff1a;c#基本数据类型占用字节数/取值范围/包装类-各基本类型.net类型,占用bit位数,默认值及取值范围

解决 IDEA 修改代码重启不生效的问题

前言 在使用 IntelliJ IDEA 进行 Java 项目开发时&#xff0c;有时会遇到一个令人头疼的问题&#xff1a;修改了代码后&#xff0c;重启服务却发现更改没有生效。通常情况下&#xff0c;解决这个问题需要通过 Maven 的 clean 和 compile 命令来强制重新编译&#xff0c;但这显…

React教程第二节之虚拟DOM与Diffing算法理解

1、什么是虚拟DOM 虚拟DOM 是javascript的一个对象&#xff0c;是内存中的一种数据结构&#xff0c;以树的形式存储UI的状态&#xff0c;树中的每个节点都代表着真实的DOM&#xff0c;用来描述我们希望在页面看到的 HTML结构&#xff1b; 现在的MVVM 框架&#xff0c;大多使用…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM&#xff0c;这种传感器的结构特别简单&#xff0c;成本特别低&#xff0c;单目相机的数据&#xff1a;照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

用jquery做一个websocket客户端

先看效果图&#xff1a; 功能很简单&#xff0c;就是作为客户端连接websocket&#xff0c;并实现接受和发送消息。具体代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"…

本地音乐服务器(二)

4. 上传音乐模块设计 4.1 上传音乐的接口设计 请求和响应设计&#xff1a; 新建music实体类&#xff1a; Data public class Music {private int id;private String title;private String singer;private String time;private String url;private int userid; } 4.2 创建Mu…

GRPC实现

1.首先下载对应编译插件&#xff0c;这里不再提供下载 2.编写proto文件 3.编写完成用命令生成go文件 protoc --go_out. --go-grpc_out. *.proto --go_out. 其中的. 是说你要编译的 .proto 文件目录为当前目录&#xff0c;按需修改 --go-grpc_out.&#xff0c;其中的. 是说你生…

「Java EE开发指南」如何使用Visual JSF编辑器设计JSP?(一)

Visual JSF Designer的目标是使创建JSF应用程序的特定于组件的工作更容易可视化&#xff0c;在本教程中&#xff0c;您将使用可视化设计器设计JSF登录页面&#xff0c;将学习如何&#xff1a; 创建一个JSF项目创建一个新的JSF页面设计JSF页面 该功能在MyEclipse中可用。 MyE…

大模型(LLMs)RAG 版面分析——表格识别方法篇

大模型&#xff08;LLMs&#xff09;RAG 版面分析——表格识别方法篇 一、为什么需要识别表格&#xff1f; 表格的尺寸、类型和样式展现出多样化的特征&#xff0c;如背景填充的差异性、行列合并方法的多样性以及内容文本类型的不一致性等。同时&#xff0c;现有的文档资料不…

力扣(leetcode)题目总结——动态规划篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言

案例场景&#xff1a; 在实际的后台中需要变更某个订单的状态&#xff0c;在官网中不刷新页面&#xff0c;可以自动更新状态 在前端页面实现订单状态的实时更新&#xff08;不刷新页面&#xff09;&#xff0c;可以通过 WebSocket 的方式与后台保持通信&#xff0c;监听订单状态…

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

面试题:Kafka(一)

1. Kafka如何保证消息不丢失 生产者发送消息到Brocker丢失 设置异步发送 消息重试 消息在Brocker中存储丢失 发送确认机制acks 消费者从Brocker接收消息丢失 Kafka 中的分区机制指的是将每个主题划分成多个分区&#xff08;Partition&#xff09;topic分区中消息只能由消费者…

[Redis#1] 前言 | 再谈服务端高并发分布式结构的演进

目录 电子商务应用架构演进 概述 常见概念 架构演进 总结 总结 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff0…