Rust-数组

数组是一个容器,它在一块连续空间内存中,存储了一系列的同样类型的数据。

数组中元素的占用空间大小必须是编译期确定的。

数组本身所容纳的元素个数也必须是编译期确定的,执行阶段不可变。

如果需要使用变长的容器,可以使用标准库中的Vec/LinkedList等。数组类型的表示方式为[T;n]。

其中T代表元素类型;n代表元素个数;它必须是编译期常量整数;中间用分号隔开。

下面看一个基本的示例:

在这里插入图片描述

多维数组

既然[T;n]是一个合法的类型,那么它的元素T当然也可以是数组类型,因此[[T;m];n]类型自然也是合法类型。示例如下:

在这里插入图片描述

数组切片

对数组取借用borrow操作,可以生成一个“数组切片”(Slice)。

数组切片对数组没有“所有权”,我们可以把数组切片看作专门用于指向数组的指针,是对数组的另外一个“视图”。

比如,我们有一个数组[T;n],它的借用指针的类型就是&[T;n]。

它可以通过编译器内部魔法转换为数组切片类型&[T]。

数组切片实质上还是指针,它不过是在类型系统中丢弃了编译阶段定长数组类型的长度信息,而将此长度信息存储为运行期的值。示例如下:

在这里插入图片描述

DST和胖指针

从前面的示例中可以看到,数组切片是指向一个数组的指针,而它比指针又多了一点东西——它不止包含有一个指向数组的指针,切片本身还含带长度信息。

Slice与普通的指针是不同的,它有一个非常形象的名字:胖指针(fat pointer)。

与这个概念相对应的概念是“动态大小类型”(Dynamic Sized Type,DST)。

所谓的DST指的是编译阶段无法确定占用空间大小的类型。为了安全性,指向DST的指针一般是胖指针。

比如:对于不定长数组类型[T],有对应的胖指针&[T]类型;对于不定长字符串str类型,有对应的胖指针αstr类型;以及在后文中会出现的Trait Object;等等。

由于不定长数组类型[T]在编译阶段是无法判断该类型占用空间的大小的,目前我们不能在栈上声明一个不定长大小数组的变量实例,也不能用它作为函数的参数、返回值。

但是,指向不定长数组的胖指针的大小是确定的,&[T]类型可以用做变量实例、函数参数、返回值。

通过前面的示例我们可以看到,&[T]类型占用了两个指针大小的内存空间。

Range

Rust中的Range代表一个“区间”,一个“范围”,它有内置的语法支持,就是两个小数点…。示例如下:

在这里插入图片描述

边界检查

在前面的示例中,我们的“索引”都是一个合法的值,没有超过数组的长度。如果我们给“索引”一个非法的值会怎样呢:

在这里插入图片描述
编译通过,执行thread’main’panicked at index out of bounds:the len is 5 but the index is10’。

可以看出,如果用/test10,则会出现数组越界,Rust目前还无法任意索引执行编译阶段边界检查,但是在运行阶段执行了边界检查。下面我们分析一下边界检查背后的故事。

在Rust中,“索引”操作也是一个通用的运算符,是可以自行扩展的。

如果希望某个类型可以执行“索引”读操作,就需要该类型实现std::ops::Index trait,如果希望某个类型可以执行“索引”写操作,就需要该类型实现std::ops::IndexMut trait。

对于数组类型,如果使用usize作为索引类型执行读取操作,实际执行的是标准库中的以下代码:

在这里插入图片描述

字符串

字符串是非常重要的常见类型。相比其他很多语言,Rust的字符串显得有点复杂,主要是跟所有权有关。Rust的字符串涉及两种类型,一种是&str,另外一种是string。

&str

str是Rust的内置类型。&str是对str的借用。Rust的字符串内部默认是使用utf-8编码格式的。而内置的char类型是4字节长度的,存储的内容是Unicode Scalar Value。

所以,Rust里面的字符串不能视为char类型的数组,而更接近u8类型的数组。

实际上str类型有一种方法:fn as_ptr(&self)->*const u8。

它内部无须做任何计算,只需做一个强制类型转换即可。

String

接下来讲string类型。它跟&str类型的主要区别是,它有管理内存空间的权力。

关于“所有权”和“借用”的关系,&str类型是对一块字符串区间的借用,它对所指向的内存空间没有所有权,哪怕&mut str也一样。比如:

let greeting:&str =“Hello”;

我们没办法扩大greeting所引用的范围,在它后面增加内容。但是string类型可以。示例如下:

在这里插入图片描述

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

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

相关文章

vue2使用electron以及打包配置

1.创建项目 vue create vue-project 2.安装electron vue add electron-builder会自动安装相关依赖 安装成功后会在src下自动生成一个background.js文件就是相应的electron的配置信息 use strictimport { app, protocol, BrowserWindow } from electron import { createProto…

缓存和数据库一致性

前言: 项目的难点是如何保证缓存和数据库的一致性。无论我们是先更新数据库,后更新缓存还是先更新数据库,然后删除缓存,在并发场景之下,仍然会存在数据不一致的情况(也存在删除失败的情况,删除…

Docker-Compose构建lnmp

目录 实验前准备安装composeNginx准备工作目录准备Dockerfile脚本准备nginx.conf Mysql准备工作目录编写Dockerfile脚本准备my.cnf PHP准备工作目录准备相关文件 编写docker-compose.yml配置文件目录结构启动测试Mysql授权测试 问题Mysql容器无权访问问题浏览器访问file not fo…

计算机网络 网络安全

网络安全 网络安全问题概述 计算机网络面临的女全性威胁 计算机网络的通信而临两大类威胁,即被动攻击和主动攻击 被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中,攻击者只是观察和分析某一个协议数据单元 PDU…

R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_orig_ext (data, rank, temporal_extent…

各种版本对应关系:SpringCloudAlibaba——SpringCloud——SpringBoot——SpringFramework——JDK

SpringCloudAlibaba——SpringCloud——SpringBoot——SpringFramework——JDK 一般情况,在https://github.com/项目/wiki目录下有发布信息及对应的要求其他依赖的版本信息SpringCloudAlibaba——SpringCloud——SpringBootSpringBoot和SpringFramework的版本对应关…

基于MATLAB计算无线通信覆盖(一)环境准备

一、环境 MATLAB 2022b 注:开始仿真前需部署地理坐标区和地理图,最好采用第三种,直接把底图数据下载到本地,防止连接不上网络时只能显示darkwater的底图。 可用于地理坐标区和地理图的底图如下表所示 二、下载底图并安装 工具&…

如何用GPT进行论文润色与改写?

详情点击链接:如何用GPT/GPT4进行论文润色与改写?一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二…

最新可用GPT-3.5、GPT-4、Midjourney绘画、DALL-E3文生图模型教程【宝藏级收藏】

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即

成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员,完成该课程后,学员将达到DevOps的专家级水平&#x…

CentOs7.8安装原生Jenkins2.38教程

CentOs7.8安装Jenkins教程 前提:1、下载安装包2、安装:3、检验是否安装成功:4、查询java路径5、修改配置文件6、创建jenkins用户7、给jenkins用户授权8、开放防火墙端口9、运行和其他jenkins相关命令10、异常情况10.1 提示超时,查…

DAG最小路径点覆盖,最小路径可重复覆盖,详解

文章目录 前言有向无环图的最小路径点覆盖概念拆点二分图定理**证明** 最小路径可重复覆盖解决策略代码实现 OJ练习 前言 关于二分图:二分图及染色法判定 关于二分图最大匹配:二分图最大匹配——匈牙利算法详解 关于二分图带权最大完备匹配&#xff1…

NFS网络共享服务存储

目录 一、NFS简介 1、NFS定义: 2、NFS的特点 3、NFS的优缺点 4、NFS的原理图示 二、服务端NFS配置文件:/etc/exports 三、实验:NFS共享存储服务配置 1、服务端安装nfs-utils与rpcbind软件包 2、服务端新建共享文件夹目录并赋予权限 …

前端(html+css+javascript)作业--展现家乡的网页

期末期间,老师布置了前端作业,现在放到这里,给各位同志参考。 桂平市是广西壮族自治区的一个美丽的城市,拥有丰富的历史文化和自然景观,属于贵港市管辖,那为什么是看起来是市级而不是县级,其实他…

HAL库配置RS485通信

在配置好串口的基础上完成RS485的配置 一、使能RS485的发送和接收模式引脚 __HAL_RCC_GPIOG_CLK_ENABLE();//高电平是发送模式,低电平是接收模式,默认是接收模式HAL_GPIO_WritePin(PG4_RS485_DIR1_Port, PG4_RS485_DIR1_Pin, GPIO_PIN_RESET);GPIO_Init…

Java基础面试题(三)

Java基础面试题(三) 文章目录 Java基础面试题(三)什么是字节码?采用字节码的好处是什么?为什么说 Java 语言“编译与解释并存”? 文章来自Java Guide 用于学习如有侵权,立即删除 什么是字节码?采用字节码…

Qt命令行安装:linux(ubuntu)

起因是我上一篇文章说的,官网下的安装包卡死在第一步安装界面了。 于是我就问GPT有没有纯命令行的安装方式,果然是有的。 在Ubuntu上安装Qt可以使用以下命令: 1. 首先,添加Qt的官方存储库到系统中: sudo add-apt-rep…

在Ubuntu下载Python3.6 并建立软连接

打开终端,输入su root,进入root模式 su root为了避免权限问题 安装zlib1g-dev apt-get install zlib1g-dev1.然后创建目录 mkdir -p /usr/local/python32.进入python3目录 cd /usr/local/python33.从官网下载好python3.6.2 wget https://www.python.org/ftp/p…

Qt QRubberBand 如何实现鼠标框选控件

QRubberBand类提供了一个矩形或直线,可以指示选择或边界。常见的模式是结合鼠标事件来执行此操作。本文将使用框选QCheckBox控件,来演示QRubberBand是如何配合鼠标进行工作的。 一、RubberBand 框选效果图 二、RubberBand 代码 rubberband.h #ifndef …

【ug572】UltraScale体系结构时钟资源手册节选

概述 时钟架构概述 The UltraScale architecture clocking resources manage complex and simple clocking requirements with dedicated global clocks distributed on clock routing and clock distribution resources. The clock management tiles (CMTs) provide clock f…