Rust语言入门教程(六) - 字符串类型
在Rust中, 字符串类型其实是一个比较复杂的话题。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联:
str: 字符串切片String字符串
其中, 字符串切片的常见形式是它的借用类型&str, 通常,一些字符串字面量都属于&str类型 ,例如:
let msg = "Hello 🌏"; // msg的类型是&str
字符串切片通常也被直接称为字符串, 很多人会把它跟另一种字符串类型String混淆。他们之间的主要区别在于:
&str: 是一个借用,不能被修改String: 可以被修改
我们常用两个函数将字符串切片转换成字符串:
let msg = "ab🎉".to_string(); // 调用字符串切片的to_string()函数
let msg = String::from("ab🎉"); // 将字符串切片作为参数传给String类型的from函数
从数据结构的角度来看, &str类型由一个指向一组字节的指针和长度(len)属性组成
String类型由一个指向一组字节的指针, 长度(len)属性和容量(capacity)属性组成

因此,可以看出,&str其实可以看作是String的一部分。 因此, 它们也具有很多其他相同的特征, 例如,根据定义、编译器强制要求以及运行时检查,这两种字符串类型都是有效的 UTF-8格式。
另外, 不论是&str还是String, 都不能用下标来访问对应位置的字符,因为英文并不是这个世界上唯一的语言, 随便google一下就可以得知,这个世界上至少有6900多种不同的语言文字和甚至还有各种不同的表情图案, 要把这么多种文字都能通过编码的形式表达, 只有Unicode编码可以做到, 因此, 字符串都是Unicode编码的, 这就是为什么字符串中的字符不能用下标来访问的原因,例如:
let word = "สวัสดี";
如果我们想要通过下标来访问最后一个符号,可能会想到这样做:
word[3] // ดี
但这不能得到我们想要的结果,实际上,上面的字符串会被存储在一个18字节的可变数组(vector)中, 如下:
| 224 | 184 | 170 | 224 | 184 | 177 | 224 | 184 | 177 | 224 | 184 | 170 | 224 | 184 | 148 | 224 | 184 | 181 |
|---|
上面的word[3]实际上得到的就是上面这个数组中的第4个元素224, UTF-8的编码规则下, 一个Unicode字符可能占用1 - 4个字节的长度不定,因此必须要遍历每个字节,才知道每个符号从哪里开始,在哪里结束。在上面的例子中,每3个字节代表了一个Unicode符号(scalars):

而其中可能由一个或多个Unicode符号才能组成一个有意义的文字符号(graphemes)
Rust的标准库的集合类型提供的索引操作始终保证是时间恒定的操作, 但是对于字符串的索引却不能做到,因为当我们对字符串进行索引操作时,得到的是字节,而这个结果大概率并不是我们想要得到的结果(如上所述,一个有意义的语言文字字符可能是一个或多个字节组成的)。
所以当我们看到一个字符串时,我们可以选择进行下面的操作:
word.bytes();: 用bytes()函数来获取字符串的UTF-8字节的向量(Vector), 如果你能保证使用的文字只有ASCII码中包含的部分的话, 用索引来获取字符串中的字符也没有问题;word.chars(): 用chars()函数可以获得一个迭代器,可以返回字符串中的每个Unicode标量, 再用例如unicode-segmentation这样的包中提供的函数,来得到有意义的文字符号 。
如果选择使用迭代器来处理字符串的话, 迭代器提供了一个函数nth(), 可以用来替代索引, 例如:
word.chars().nth(3) // 获取word中的第4个Unicode标量
Rust的字符串类型提供了许多现成的函数,用于处理字符串,下面是列出的一些:

相关文章:
Rust语言入门教程(六) - 字符串类型
在Rust中, 字符串类型其实是一个比较复杂的话题。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联: str: 字符串切片String 字符串 其中, 字…...
【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。
操作环境: MATLAB 2022a 1、算法描述 QPSK,有时也称作四位元PSK、四相位PSK、4-PSK,在坐标图上看是圆上四个对称的点。通过四个相位,QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率(BER) —…...
关于C语言控制浮点数输出精度问题
众所周知 C语言在控制一个浮点数输出精度的时候是在%和f之间加上一个.(想要控制的精度) 如:printf("%.2f", num); 问,试问:(你就是我的御主吗?)如果输出的精度是根据输入的数字变化的怎么办&am…...
【Linux 静态IP配置】
静态IP配置 1.NAT模式设置2.设置静态ip3.重启网络4.查看ip 1.NAT模式设置 首先设置虚拟机中NAT模式的选项,打开VMware,点击“编辑”下的“虚拟网络编辑器”,设置NAT参数 注意: VMware Network Adapter VMnet8保证是启用状态 …...
【Linux 操作系统配置 SFTP】
Linux 操作系统配置 SFTP sftp采用的是ssh加密隧道,安装性方面较ftp强,而且依赖的是系统自带的ssh服务,不像ftp还需要额外的进行安装基于 ssh 的 sftp 服务相比 ftp 有更好的安全性(非明文帐号密码传输)和方便的权限管…...
信贷专员简历模板
这份简历内容,以信贷专员招聘需求为背景,我们制作了1份全面、专业且具有参考价值的简历案例,大家可以灵活借鉴。 信贷专员简历在线编辑下载:百度幻主简历 求职意向 求职类型:全职 意向岗位:信贷专员 …...
Python自动化测试面试经典题
相信大家经历过许多面试都会有这样的感受:好不容易通过了 2 -3轮技术面试,但是薪资不够理想;要么被面试的测试专家虐的不要不要的。但每一次的面试也能让自己认识到不足之处,这样才有利于后续拿到理想的offer。 牛鹭学院的学子对…...
java+springboot物流管理系统设计与实现wl-ssmj+jsp
物流管理系统的开发和综合性的物流信息网站平台的建设。研究的重点是运输管理信息系统.本系统是一套基于运输作业流程的管理系统,该系统以运输任务、货品、商务三大线索设计开发。运输任务是该管理系统的核心,系统通过对运输任务中的接收、调…...
概念理论类-k8s :架构篇
转载:新手通俗易懂 k8s :架构篇 Kubernetes,读音是[kubə’netis],翻译成中文就是“库伯奈踢死”。当然了,也可以直接读它的简称:k8s。为什么把Kubernetes读作k8s,因为Kubernetes中间有8个字母…...
window10家庭版中文转专业版流程
1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions ,查询当前支持的升级的版本 4.专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T...
Chrome显示分享按钮
分享按钮不见了! Chrome://flags Chrome Refresh 2023 Disabled 左上角的标签搜索会到右上角。...
GPTS-生成一个动漫图像GPT
介绍 GPTs是ChatGPT的定制版本,用户可以通过组合指令、知识和功能来定制用于特定任务或主题的GPT。它们可以根据需要简单或复杂,解决从语言学习到技术支持等各种事情。 创建GPTs Plus和Enterprise用户可以在chat.openai.com/create上开始创建GPTs。 您可以通过在ChatGPT上的…...
在gazebo里搭建一个livox mid360 + 惯导仿真平台测试 FAST-LIO2
在gazebo里搭建一个livox mid360 惯导仿真平台测试 FAST-LIO2 前言立方体平台加入 livox mid360 激光雷达加入IMU模块调整底盘大小 并设计调用接口测试 Fast-Lio2 前言 livox mid360 在官网一直没有货,在gazebo里可以仿真该雷达形式的点云。 但是其只发布雷达的数…...
SpringMVC文件下载
<!--解决找不到“jquery-3.4.1.min.js”(静态资源访问)的问题 --> <mvc:default-servlet-handler/>方式1:如果去掉download就是查看图片 <a href"${pageContext.request.contextPath}/uploadfiles/${requestScope.filena…...
前端项目打包放到springboot项目时,访问不带index.html
当您的前端项目被打包并放到 Spring Boot 项目中时,如果想要通过访问不带 index.html 的路径来直接进入前端页面,您可以使用以下方法: 1,在 Spring Boot 项目中添加一个路由规则,将所有对特定路径的请求重定向到前端页…...
Tomcat注册为服务后,如何配置Tomcat内存大小
前提条件:tomcat已经注册为服务。 1.winR,输入regedit打开注册表 2.找到Tomcat注册表路径: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat80603.找到jvm内存配置路径: HKEY_LOCAL_MACHINE\SOFTW…...
C语言入门实战教程——嵌入式必备教程(2023年版最全最新整理)
一、初识C语言 C语言诞生于美国的贝尔实验室,由丹尼斯里奇(Dennis MacAlistair Ritchie)以肯尼斯蓝汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,C语言是一个功能简化的版本,它使C…...
Chatbot开发三剑客:LLAMA、LangChain和Python
聊天机器人(Chatbot)开发是一项充满挑战的复杂任务,需要综合运用多种技术和工具。在这一领域中,LLAMA、LangChain和Python的联合形成了一个强大的组合,为Chatbot的设计和实现提供了卓越支持。 首先,LLAMA是…...
【Spring之AOP底层源码解析】
文章目录 一、动态代理1.1、ProxyFactory1.2、Advice的分类1.3、Advisor的理解 二、创建代理对象的方式2.1、ProxyFactoryBean2.2、BeanNameAutoProxyCreator2.3、DefaultAdvisorAutoProxyCreator 三、Spring AOP的理解3.1、AOP中的概念3.2、Advice在Spring AOP中对应API3.3、T…...
【UCAS自然语言处理作业二】训练FFN, RNN, Attention机制的语言模型,并计算测试集上的PPL
文章目录 前言前馈神经网络数据组织Dataset网络结构训练超参设置 RNN数据组织&Dataset网络结构训练超参设置 注意力网络数据组织&Dataset网络结构Attention部分完整模型 训练部分超参设置 结果与分析训练集Loss测试集PPL 前言 本次实验主要针对前馈神经网络࿰…...
Token 成本暴跌 280 倍,为什么用 AI 替代初级开发,依然算不拢账?
从董事会的 PPT 翻车,看 AI 降本神话背后的全成本真相上周我旁听了一场 C-suite 高管会议,亲眼看着一位副总裁被自己的 PPT 逼入绝境。会议的主题是 AI 项目的成本收益,他准备了一套无懈可击的逻辑:大模型 Token 价格 3 年暴跌 28…...
Net/Net Core微信公众号上传图片永久图片素材和内容中图片素材不能用MultipartFormDataContent的坑
测试了N次,不能用net自带的 MultipartFormDataContent,否则微信公众号会一直报错41005错误,具体原因不详,只能拼装head字符串实现,下面是封装好的上传永久素材和临时图片素材的方法,下面为测试好的代码&…...
ZLMediaKit(webrtc)在CentOS7上的高效部署与常见问题解决指南
1. 环境准备与依赖安装 在CentOS7上部署ZLMediaKit(webrtc)前,需要先搞定基础环境。我遇到过不少新手直接克隆代码就开始编译,结果被各种报错劝退。下面这些依赖就像盖房子前要打的地基,缺一不可。 1.1 更新系统与基础工具 刚装好的CentOS7就…...
Slim模板终极部署指南:从开发到生产的完整流程
Slim模板终极部署指南:从开发到生产的完整流程 【免费下载链接】slim Slim is a template language whose goal is to reduce the syntax to the essential parts without becoming cryptic. 项目地址: https://gitcode.com/gh_mirrors/sli/slim Slim模板语言…...
LTR308环境光传感器驱动开发与嵌入式集成指南
1. LTR308环境光传感器库技术解析与工程实践指南Lite-On LTR-308 是一款高精度、低功耗的环境光传感器(Ambient Light Sensor, ALS),专为智能手机、平板电脑、可穿戴设备及工业人机界面等对光照感知精度和能效比要求严苛的应用场景设计。其核…...
Hotkey Detective:定位并解决Windows快捷键冲突的终极方案
Hotkey Detective:定位并解决Windows快捷键冲突的终极方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 一、…...
WebPlotDigitizer终极指南:从科研图表到结构化数据的完整解决方案
WebPlotDigitizer终极指南:从科研图表到结构化数据的完整解决方案 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 在科研和…...
LSM303D六轴IMU驱动开发:I²C底层集成与100Hz高精度运动检测
1. LSM303D传感器驱动库深度解析:面向嵌入式系统的IC底层集成与高精度运动检测实现LSM303D是意法半导体(STMicroelectronics)推出的超低功耗、高精度六轴惯性测量单元(IMU),集成3轴加速度计与3轴磁力计于单…...
事件驱动:为AI原生应用领域注入新活力
事件驱动:为AI原生应用领域注入新活力关键词:事件驱动、AI原生应用、事件流、实时响应、异步架构、微服务、事件溯源摘要:本文将带你走进「事件驱动」与「AI原生应用」的交叉领域,通过生活案例、技术原理解析和实战代码࿰…...
日结零工市场的权益保障困境与系统性治理路径
一、现象审视:弱势单元的权益真空日结零工作为弹性用工体系中最灵活、最底层的用工形态,其劳动者长期处于权益保障的真空地带。本文基于对B市线上日结零工市场的田野研究发现,日结零工劳动者面临三重结构性弱势:第一,法…...
