Rust字符串详解

文章目录

    • 字符串切片
    • String
    • 迭代方法
    • 基础字符串方法
    • 容量操作
    • 增删改查

字符串切片

我们所熟知的由双引号括起来的字符串,在Rust中只是个字符串切片,又叫字符串字面值。这种类型一旦创建,则不可更改。但支持索引,从切片中索引出来的内容,仍是切片,其基本语法有二

  • st..ed 表示从第st个字符开始,到第ed-1个字符为止
  • st..=ed 表示从第st个字符开始,到第ed个字符为止

示例如下

fn main(){let s = "micro cold";let a = s.to_string();println!("{}", &s[1..4]);println!("{}", &a[1..=4]);
}

输出为

icr
icro

String

String是Rust标准库实现的结构体,其内容、长度均可更改,Rust提供了如下三种创建字符串的方法,其中两种基于字面量。

  • 创建空字符串 let e = String::new()
  • 创建长度为N的字符串 let c = String::with_capacity()
  • 从字面量创建字符串 let s = String::from("rust")
  • 调用字面量的内置方法 let t = "rust".to_string()

其中,new, from, with_capacity为String结构体的关联函数,to_string则是字面量的成员方法。

String类型并不支持索引,但通过&可以获取其对应的字面量,从而支持字面量的切片操作。

此外,非常诡异地,Rust对加号进行了运算符重载,但其左侧第一个值必须是字符串,而其他值则必须为字面量。示例如下

fn main(){//let s = "micro" + "cold";  //报错let s = "micro cold";let a = s.to_string();println!("{}", a + "!");    // 不报错//println!("{}", a + a);    // 报错//println!("{}", a + &a);   // 报错,但原因是所有权
}

输出为

micro cold!

迭代方法

String结构体中封装了许多迭代器,包括

  • .chars() 遍历字符串的Unicode字符
  • .bytes() 遍历字符串的字节序列
  • .split© 根据c对字符串进行拆分,并遍历
  • .split_whitespace() 根据空格对字符串进行拆分,并遍历

此外,对于多行文本,还有.lines,可将字符串按行分割为迭代器,每个元素都是一行文本。

fn main(){//let s = "micro" + "cold";  //报错let s = "micro cold".to_string();for c in s.chars(){println!("{}", c);}for b in s.bytes(){println!("{}", b);}println!("====split by o");for o in s.split("o"){println!("{}", o);}println!("====split_whitespace");for w in s.split_whitespace(){println!("{}", w);}
}

输出结果如下

m
i
c
r
oc
o
l
d
109
105
99
114
111
32
99
111
108
100
====split by o
micrc
ld
====split_whitespace
micro
cold

除了上述迭代用法,Rust字符串还提供了返回元组的拆分函数

  • split_at():将字符串分成两个部分,在指定的位置进行分割。
  • split_off():从字符串的指定位置分离出一个子字符串,并返回新的 String 对象。

基础字符串方法

除了clone这种深拷贝必备方法外,String还实现了诸多功能,如下表所示

属性长度 len(), 字节数 capacity
判定是否为空 is_empty()
大小写转换转小写 to_lowercase();转大写 to_uppercase()
类型转换转字节数组 as_bytes();转字节向量into_bytes();
转可变切片 as_mut_str();转切片as_str()
删除空格首空格trim_start();尾空格trim_end();首尾空格trim()
关系包含关系contain(), 相等eq(),
首尾判断以某字符串开头starts_with();以某字符串结尾ends_with()

这些方法的调用形式均为s.xxx(),示例如下

fn main(){let mut s = "micro cold".to_string();println!("len:{}", s.len());println!("uppercase:{}", s.to_uppercase());
}

结果如下

len:10
uppercase:MICRO COLD 

容量操作

字符串为了实现内容可变,必须要预留一定的空间,为此Rust提供了一些函数

  • reserve():为字符串新增一些空间
  • shrink_to_fit():将字符串的容量缩小到它所包含的内容所需的最小值。
  • shrink_to():将字符串的容量缩小到指定下限。如果当前容量小于下限,或者大于当前值,则什么也不做。
fn main(){let mut s = "micro cold".to_string();println!("original capacity = {}", s.capacity());s.reserve(10);println!("after reserve = {}", s.capacity());s.shrink_to_fit();println!("fit capacity = {}", s.capacity());s.shrink_to(25);println!("fit to 25 = {}", s.capacity());
}

效果如下

original capacity = 10
after reserve = 20
fit capacity = 10
fit to 25 = 10

增删改查

String是可变字符串,故而提供了诸多增加、删除、改动的操作

类别方法
弹出与追加追加字符push;追加字符串push_str;弹出最后一个字符pop
删除清空clear;截短truncate;删除某位置remove
匹配删除remove_matches
插入插入字符insert;插入字符串insert_str
替换匹配替换replace;位置替换replace_range;
匹配从左查找find;从右查找rfind,均返回第一个匹配的位置

下面对上述方法进行测试

fn main(){let mut s = "micro cold".to_string();s.push('a');println!("push('a') -> {}", s);s.push_str("bcd");println!("push_str(\"bcd\") -> {}", s);s.truncate(10);println!("truncate(3) -> {}", s);s.remove(1);println!("remove(1) -> {}", s);s.insert(1, 'i');println!("insert(1, 'i') -> {}", s);s.insert_str(0, "hello ");println!("insert_str(0, \"hello \") -> {}", s);s.replace_range(0..5, "Hola");println!("replace_range(0..5, \"Hola\") -> {}", s);println!("s.replace(\"Hola\", \"你好\") -> {}", s.replace("Hola", "你好"));
}

测试结果如下

push('a') -> micro colda
push_str("bcd") -> micro coldabcd
truncate(3) -> micro cold
remove(1) -> mcro cold
insert(1, 'i') -> micro cold
insert_str(0, "hello ") -> hello micro cold
replace_range(0..5, "Hola") -> Hola micro cold
s.replace("Hola", "你好") -> 你好 micro cold

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中.NET 6.0控制台应用通过EF访问已建数据库

目录 一、新建.NET 6.0控制台应用并建立数据库连接 二、下载并安装EF程序包 三、自动生成EF模型和上下文 1.Blog类模型 2.Post类模型 3.数据库上下文 四、设计自己的应用 VS2022的.NET6.0、.NET7.0框架下默认支持EF7(版本号7.0.13),除…

基于XML的声明式事务

场景模拟 参考基于注解的声明式事务 修改Spring的配置文件 将Spring配置文件中去掉tx:annotation-driven标签&#xff0c;并添加配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org…

.net6+aspose.words导出word并转pdf

本文使用net6框架&#xff0c;aspose.word破解激活并兼容net6&#xff0c;导出word模板并兼容识别html并给其设置字体&#xff0c;前端直接浏览器下载&#xff0c;后端保存文件并返回文件流&#xff0c;还有批量导出并压缩zip功能 1、安装Aspose.Words的nuget包选择21.8.0 版本…

LeetCode //C - 191. Number of 1 Bits

191. Number of 1 Bits Write a function that takes the binary representation of an unsigned integer and returns the number of ‘1’ bits it has (also known as the Hamming weight). Note: Note that in some languages, such as Java, there is no unsigned inte…

Labview实现wav音乐播放

准备音频文件&#xff1a;将要播放的声音文件准备好&#xff0c;是.wav格式。 图形化如下&#xff1a; 内部逻辑如下&#xff1a;

如何在thingsboard的规则链中对一个遥测属性进行求平均值

背景 有这样一个需求,一个温度传感器每5秒,上传一次数据。要求算出该设备2分钟内的平均温度,如果超过某个值,则发送告警邮件。 具体操作实现 下面在规则链中实现求平均值。 使用的节点是 配置如下 必填 Timeseries keys,是要求的平均值的属性名。 我这里求的是四个…

【java】idea可以连接但看不到database相关的files

问题 idea右侧有database工具栏&#xff0c;但点击没有在recent files看到数据库相关文件 问题排查 点击 help-> show log in explorer查看日志 发现显示 2023-11-13 10:28:09,694 [1244376] INFO - #c.i.c.ComponentStoreImpl - Saving appDebuggerSettings took 22…

VB.NET三层之用户查询窗体

目录 前言: 过程: UI层代码展示: BLL层代码展示: DAL层代码展示: 查询用户效果图:​ 总结: 前言: 想要对用户进行查询&#xff0c;需要用到控件DataGrideView&#xff0c;通过代码的形式将数据库表中的数据显示在DataGrideview控件中&#xff0c;不用对DatGridView控件…

大模型需要哪种服务器

大型模型通常需要高端的服务器来支持&#xff0c;需要满足以下要求&#xff1a; 高性能的CPU&#xff1a;最好是具备多核心的CPU&#xff0c;例如Intel Xeon或AMD EPYC等服务器级处理器&#xff0c;这些处理器具备更高的计算效率和更大的缓存容量&#xff0c;加快了计算速度。 …

jenkins分步式构建环境(agent)

rootjenkins:~# netstat -antp|grep 50000 tcp6 0 0 :::50000 ::&#x1f617; LISTEN 5139/java 1.52 安装Jenkins rootubuntu20:~# dpkg -i jenkins_2.414.3_all.deb 配置各种类型的Agent的关键之处在于启动Agent的方式 ◼ JNLP Agent对应着“通过Java Web启动代理”这种方…

Pass基础-DevOps

&#xff0c;DevOps是Dev&#xff08;开发&#xff09;和Ops&#xff08;运维/运营&#xff09;的结合&#xff0c;它将人、流程、工具、工程实践等等结合起来应用到IT价值流的实现过程中&#xff0c;是一系列原则、方法、流程、实践、工具的综合体。DevOps面向应用的全生命周期…

mysqldump导出表

很多时候需要导出生产环境的数据库表&#xff0c;而这个时候又没有可视化操作界面&#xff08;navicat&#xff09;&#xff0c;要想导出就必须用mysqldump命令了&#xff0c;下面介绍几种常用的导出命令。 1.导出表&#xff08;包含数据&#xff09; mysqldump -u 用户名 -p…

js编辑只取修改后的对象的属性和值

需求&#xff1a;在el-table的列表编辑操作后&#xff0c; 第一步&#xff1a;获取当前行数据&#xff0c;为对象&#xff1a;{}&#xff0c; 第二步&#xff1a;数据回填 第三步&#xff1a;编辑 第四步&#xff1a;请求后端接口 本文章操作就是在编辑完成后&#xff0c;只取编…

深度学习 YOLO 实现车牌识别算法 计算机竞赛

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

springboot整合SSE技术开发经验总结及心得

springboot整合SSE技术开发经验总结及心得 一、开发背景二、快速了解SSE1、概念2、特性 三、开发思路四、代码演示1、引入依赖2、服务端代码3、后端定时任务代码 4、解决乱码的实体类4、前端代码 五、核心代码分析 一、开发背景 公司需要开发一个大屏界面&#xff0c;大屏页面…

查找py源代码目录

要查找Python源代码目录&#xff0c;你可以按照以下步骤进行操作&#xff1a; 打开终端或命令提示符窗口。输入以下命令来查找Python源代码目录&#xff1a; python -m site该命令将显示Python安装位置的相关信息&#xff0c;包括site-packages目录路径。该目录通常包含Pytho…

027 - STM32学习笔记 - ADC初识(一)

026- STM32学习笔记 - ADC初识&#xff08;一&#xff09; 前几天不小心把板子掉地上了&#xff0c;液晶屏摔坏了&#xff0c;暂时先停一下液晶屏的学习&#xff0c;等新的板子来了再继续学习。 一、ADC介绍 ADC指的是Analog to Digital Converter&#xff08;模数转换器&…

【机器学习基础】机器学习入门(2)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a;【机器学习基础】机器学习入门&#xff08;1&#xff09; &#x1f4a1;…

VB.net TCP服务端监听端口接收客户端RFID网络读卡器上传的读卡数据

本 示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) Imports System.Threading Imports System.Net Imports System.Net.Sockets Public Class Form1Dim ListenSocket As SocketDim Dict As New Dictionary(Of…