Rust切片、结构体、枚举
文章目录
- 切片类型
- 字符串切片
- 其他结构的切片
- 结构体
- 结构体实例
- 元组结构体
- 结构体所有权
- 输出结构体
- 结构体的方法
- 结构体关联函数
- 单元结构体
- 枚举
- match语法
- Option枚举类
- if let 语句
切片类型
切片(Slice)是对数据值的部分“引用”
我们可以从一个数据集合中取一部分来使用
字符串切片
例如
fn main() {let s = String::from("broadcast");let part1 = &s[0..5];let part2 = &s[5..9];println!("{}={}+{}", s, part1, part2);
}
这里的0..5是前闭后开区间实际上内存上是这样的

有一些简便的写法,可以这样写
..y 等价于 0..y
x.. 等价于位置 x 到数据结束
.. 等价于位置 0 到结束
被切片引用的字符串是不允许被修改的,除此之外,我们需要区分str和String这两个字符串类型
前者指的是堆内存中的字符串,我们可以理解为常量字符串,用的时候是作为&str引用使用的
String实际上是一种数据类型,类似于C++中的string类,有追加,清空等一系列操作
这两者都支持切片,切片的结果必须是引用类型
let slice = &s[0..3];
其他结构的切片
fn main() {let arr = [1, 3, 5, 7, 9];let part = &arr[0..3];for i in part.iter() {println!("{}", i);}
}
原理都是类似的
结构体
结构体和元组是类似的,可以将不同类型的数据作为一个整体,但是结构体内部每个成员是有名字的
例如
struct Site {domain: String,name: String,nation: String,found: u32
}
这里的结构体和C++中的不太一样,这里的结构体只能用来定义类型,不能实例化对象,不需要;,成员用,分割
结构体实例
结构体实例化是使用key: value的形式进行赋值的,例如
let baidu = Site {domain: String::from("www.baidu.com"),name: String::from("baidu"),nation: String::from("China"),found: 2013
};
如果当前作用域有和成员变量名称相同的,可以直接写
let domain = String::from("www.baidu.com");
let name = String::from("baidu");
let baidu = Site {domain, // 等同于 domain : domain,name, // 等同于 name : name,nation: String::from("China"),traffic: 2013
};
如果用一个结构体实例的一部分去构建另一个结构体,可以这样写
let site = Site {domain: String::from("www.baidu.com"),name: String::from("b"),..baidu
};
但是不允许全部用旧结构体的
元组结构体
元组结构体的定义和使用更为简单,实际上是一种元组形式的结构体,区别就是有名字和固定的类型格式,主要是为了处理定义经常使用的简单类型用的
struct Color(u8, u8, u8);
struct Point(f64, f64);let black = Color(0, 0, 0);
let origin = Point(0.0, 0.0);
使用方法就和普通的元组使用是一样的了
结构体所有权
结构体实例会掌握所有成员的所有权,因为当结构体生命周期结束的时候,会释放所有字段
输出结构体
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle { width: 30, height: 50 };println!("rect1 is {:?}", rect1);
}
第一行是调用调试库,然后用:?做占位符就可以输出整个结构体的内容了,使用:#?就可以自动格式化
结构体的方法
结构体的方法主要是用于操作结构体实例本身的
Rust语言其实不是面向对象的,但是也可以实现面向对象的思想
结构体方法的第一个参数必须是&self,不需要声明类型
例如计算一个矩形的面积
struct Rectangle {width: u32,height: u32,
}impl Rectangle {fn area(&self) -> u32 {self.width * self.height}
}fn main() {let rect1 = Rectangle { width: 30, height: 50 };println!("rect1's area is {}", rect1.area());
}
调用结构体方法的时候就可以不用写self了
结构体关联函数
如果做impl中,但是没有&self参数,而是属于结构体全体的,不属于某个具体的实例
类似于C++中的静态成员函数
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}impl Rectangle {fn create(width: u32, height: u32) -> Rectangle {Rectangle { width, height }}
}fn main() {let rect = Rectangle::create(30, 50);println!("{:?}", rect);
}
单元结构体
结构体也可以不需要任何成员
struct UnitStruct;
枚举
Rust的枚举和C++的枚举还是不太一样的,但是使用是比较简单的,例如
#[derive(Debug)]enum Book {Papery, Electronic
}fn main() {let book = Book::Papery;println!("{:?}", book);
}
我们可以给枚举添加元组属性描述,或者使用结构体的语法都是可以的
enum Book {Papery(u32),Electronic(String),
}let book = Book::Papery(1001);
let ebook = Book::Electronic(String::from("url://..."));enum Book {Papery { index: u32 },Electronic { url: String },
}
let book = Book::Papery{index: 1001};
但是我们无法访问具体枚举对应的值是什么,访问的方法在下面介绍
match语法
match很类似switch,但是rust并不支持switch
例如
fn main() {enum Book {Papery {index: u32},Electronic {url: String},}let book = Book::Papery{index: 1001};let ebook = Book::Electronic{url: String::from("url...")};match book {Book::Papery { index } => {println!("Papery book {}", index);},Book::Electronic { url } => {println!("E-book {}", url);}}
}
基本格式是这样的
match 枚举类实例 {分类1 => 返回值表达式,分类2 => 返回值表达式,...
}
但是所有返回值表达式的类型必须是一样的
match除了可以处理枚举,也可以处理整数、浮点数、字符、字符串切片引用的,但是不推荐使用浮点数,有可能有精度问题
默认情况用_表示,例如
fn main() {let t = "abc";match t {"abc" => println!("Yes"),_ => {},}
}
Option枚举类
Option时Rust标准库自带的枚举类,这主要是为了解决Rust没有空引用的问题
Option具体是这样的
enum Option<T> {Some(T),None,
}
我们如果要对这个类型的数据做操作的时候,就必须先判断是否时None
fn main() {let opt = Option::Some("Hello");match opt {Option::Some(something) => {println!("{}", something);},Option::None => {println!("opt is nothing");}}
}
如果我们想要声明某个变量是空值时,就必须先声明明确的类型
fn main() {let opt: Option<&str> = Option::None;match opt {Option::Some(something) => {println!("{}", something);},Option::None => {println!("opt is nothing");}}
}
Option是默认引入的,所以可以直接写Some()或者None
if let 语句
这是一种match语句的语法糖,可以用来简化匹配match枚举类型的yufa
如果直接使用if else
let maybe_name = Some("Alice");if maybe_name {println!("Name is: {}", maybe_name); // ❌ 编译错误:不能直接判断 Option
}
正确的方式是使用if let ,当然这个后面可以加上else
let maybe_name = Some("Alice");if let Some(name) = maybe_name {println!("Name is: {}", name); // ✅ 解构出 name
}
对应的match写法是
match maybe_name {Some(name) => println!("Name is: {}", name),_ => (), // 其它情况忽略
}相关文章:
Rust切片、结构体、枚举
文章目录 切片类型字符串切片其他结构的切片 结构体结构体实例元组结构体结构体所有权输出结构体结构体的方法结构体关联函数单元结构体 枚举match语法Option枚举类if let 语句 切片类型 切片(Slice)是对数据值的部分“引用” 我们可以从一个数据集合中…...
使用人车关系核验API快速核验车辆一致性
一、 引言 随着车辆交易的日益频繁,二手车市场和金融领域的汽车抵押业务蓬勃发展。然而,欺诈和盗窃行为也时有发生,给行业带来了不小的冲击。例如,3月20日央视曝光的“新能源车虚假租赁骗补”产业链,以及某共享汽车平…...
【学习笔记】深度学习环境部署相关
文章目录 [AI硬件科普] 内存/显存带宽,从 NVIDIA 到苹果 M4[工具使用] tmux 会话管理及会话持久性[A100 02] GPU 服务器压力测试,gpu burn,cpu burn,cuda samples[A100 01] A100 服务器开箱,超微平台,gpu、…...
股票日数据使用_未复权日数据生成前复权日周月季年数据
目录 前置: 准备 代码:数据库交互部分 代码:生成前复权 日、周、月、季、年数据 前置: 1 未复权日数据获取,请查看 https://blog.csdn.net/m0_37967652/article/details/146435589 数据库使用PostgreSQL。更新日…...
Java程序设计第1章:概述
一、Hello World 1.代码: public class HelloWorld {public static void main(String[] args){System.out.println("Hello World!");} } 2.运行结果: Hello World! 二、输出姓名、学号、班级 1.题目: 编写一个Application&a…...
【LeetCode Solutions】LeetCode 146 ~ 150 题解
CONTENTS LeetCode 146. LRU 缓存(中等)LeetCode 147. 对链表进行插入排序(中等)LeetCode 148. 排序链表(中等)LeetCode 149. 直线上最多的点数(困难)LeetCode 150. 逆波兰表达式求值…...
《 如何更高效地学习》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:个人谈心 🌍文章目入 一、明确学习目标二、制定学习计划三、选择合适的学习方法(一)主动学习(二)分散学习(三&#…...
常用中间件合集
简介 在游戏或者web服务器开发过程中 难免会使用一些中间件 正所谓有现成的 就没必要重复造轮子了 以下大概介绍下常用的中间件nginx etcd nats docker k8s nginx 简介 Nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万…...
分布式数据一致性场景与方案处理分析|得物技术
一、引言 在经典的CAP理论中一致性是指分布式或多副本系统中数据在任一时刻均保持逻辑与物理状态的统一,这是确保业务逻辑正确性和系统可靠性的核心要素。在单体应用单一数据库中可以直接通过本地事务(ACID)保证数据的强一致性。 然而随着微服务架构的普及和业务场…...
JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南
1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…...
C++ - 宏基础(简单常量替换宏、函数样式的宏、多行宏、预定义宏、字符串化宏、连接宏、可变参数日志宏)
宏概述 在编程中,宏(Macro)是一种预处理器指令 宏可以让程序员在源代码中定义一段值或代码的别名,在编译程序之前,预处理器会查找这些宏,并将其替换为相应的值或代码 C 宏 在 C 中,宏可以通过…...
Linux中的调试器gdb与冯·诺伊曼体系
一、Linux中的调试器:gdb 1.1安装与版本查看 可以使用yum进行安装: yum install -y gdb 版本查看:使用指令 gdb --version 1.2调试的先决条件:release版本与debug版本的切换 debug版本:含有调试信息 release版本…...
STM32 + keil5 跑马灯
硬件清单 1. STM32F407VET6 2. STLINK V2下载器(带线) 环境配置 1. 安装ST-LINK 2. 安装并配置 keil5 https://blog.csdn.net/qq_36535414/article/details/108947292 https://blog.csdn.net/weixin_43732386/article/details/117375266 3. 接线并下载 点击"LOAD“&a…...
Ruby语言的代码重构
Ruby语言的代码重构:探索清晰、可维护与高效的代码 引言 在软件开发的过程中,代码的质量直接影响到项目的可维护性、扩展性和整体性能。随着时间的推移,系统的需求变化,代码可能会变得混乱和难以理解,因此࿰…...
leetcode 数组总结篇
基础理论 数组:下标时从 0 开始的,地址是连续的,不能删除,只能覆盖;数组的实现:vector动态数组 常用操作 头文件 #include <iostream> #include <vector> #include <cstdint> // IN…...
盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验
在数字化浪潮席卷消费市场的今天,盲盒小程序以其独特的趣味性和互动性,迅速成为了年轻人追捧的娱乐消费新宠。盲盒小程序不仅为用户带来了拆盒的惊喜和刺激,更为商家提供了创新的营销手段。为了满足市场对盲盒小程序日益增长的需求࿰…...
DuckDB系列教程:如何分析Parquet文件
Parquet 是一种强大的、基于列的存储格式,适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。 在这篇文章中,我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
GRE,MGRE
GRE:静态过程,有局限性 R1 : [r1]interface Tunnel 0/0/0 --- 创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 给隧道接口分配一个 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定义接口的封装方式 [r1-Tun…...
【linux学习】linux系统调用编程
目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…...
Azure Speech 赋能,为智能硬件注入 AI 语音 “新灵魂”
在人工智能技术飞速发展的今天,智能硬件正逐步渗透到人们生活的方方面面。AI玩具、AI眼镜、AI鼠标等创新产品不仅提升了用户体验,更带来了前所未有的交互方式。领驭科技凭借微软Azure Speech的强大技术能力,为硬件厂商提供一站式AI语音解决方…...
力扣DAY35 | 热100 | LRU缓存
前言 中等 ⚪ 这个题原本打算用双链表最小堆做,发现无解。没想到双向链表。 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int …...
Python 助力人工智能与机器学习的深度融合
技术革新的 “源动力” 在当今数字化时代,人工智能(AI)与机器学习(ML)无疑是最具影响力的技术领域,它们如同强大的引擎,推动着各个行业的变革与发展。Python 凭借其简洁易读的语法、丰富的库和…...
ARXML文件解析-1
目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 ARXML文件的结构树2.3 TAG(XML元素)2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 XML声明与根元素4.4.3.1 xmlns(默认命名空间)4.4.3.2 xmlns:xsi&…...
SignalR给特定User发送消息
1、背景 官网上SignalR的demo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个: 1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接,…...
React: hook相当于函数吗?
一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…...
Ubuntu 安装 VLC
最近项目中需要用VLC查看NVR下子设备的RTSP流,特此记录,便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...
UBUNTU编译datalink
参考文档 datalink 语雀 下载 git clone https://gitee.com/liyang9512/datalink 源码打包 mvn -Prelease-datalink -Dmaven.test.skiptrue clean install -U 启动准备 # unzip ./distribution/target/datalink-server-1.0.0.tar.gz tar -xvf ./distribution/target/da…...
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先,我们详细介绍了SSM框架,这是一种经典的Java Web开发框架,由Spring、SpringMVC和MyBatis三个开源项目整合而成,为开发企业级应用提供了高效、灵活、…...
