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

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)中, 如下:

224184170224184177224184177224184170224184148224184181

上面的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”&#xff08;静态资源访问&#xff09;的问题 --> <mvc:default-servlet-handler/>方式1&#xff1a;如果去掉download就是查看图片 <a href"${pageContext.request.contextPath}/uploadfiles/${requestScope.filena…...

前端项目打包放到springboot项目时,访问不带index.html

当您的前端项目被打包并放到 Spring Boot 项目中时&#xff0c;如果想要通过访问不带 index.html 的路径来直接进入前端页面&#xff0c;您可以使用以下方法&#xff1a; 1&#xff0c;在 Spring Boot 项目中添加一个路由规则&#xff0c;将所有对特定路径的请求重定向到前端页…...

Tomcat注册为服务后,如何配置Tomcat内存大小

前提条件&#xff1a;tomcat已经注册为服务。 1.winR,输入regedit打开注册表 2.找到Tomcat注册表路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat80603.找到jvm内存配置路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTW…...

C语言入门实战教程——嵌入式必备教程(2023年版最全最新整理)

一、初识C语言 C语言诞生于美国的贝尔实验室&#xff0c;由丹尼斯里奇&#xff08;Dennis MacAlistair Ritchie&#xff09;以肯尼斯蓝汤普森&#xff08;Kenneth Lane Thompson&#xff09;设计的B语言为基础发展而来&#xff0c;C语言是一个功能简化的版本&#xff0c;它使C…...

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;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 前言 本次实验主要针对前馈神经网络&#xff0…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...