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
相关文章:
Rust字符串详解
文章目录 字符串切片String迭代方法基础字符串方法容量操作增删改查 字符串切片 我们所熟知的由双引号括起来的字符串,在Rust中只是个字符串切片,又叫字符串字面值。这种类型一旦创建,则不可更改。但支持索引,从切片中索引出来的…...

(四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖…...

Window安装MongoDB
三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…...

20.有效的括号(LeetCode)
思路:用栈的后进先出的特性,来完成题目的要求 因为C有库,可以直接用,而C语言没有,所以我们直接把写好的栈拷贝上来用。 首先,完成框架的搭建 其次,再实现循环内的部分。1.左括号入栈 2.右括…...
Vue3组件传参之Mitt插件方式
在vue3中$on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus,对于这种情况我们可以使用Mitt库(其实就是我们视频中讲的发布订阅模式的…...

【数据仓库】数仓分层方法
文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层?1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…...

Linux网络——自定义协议
目录 一.什么是协议 二.协议与报文 三.自定义协议 1.封装套接字 2.构建请求与响应 3.序列化和反序列化 4.报头添加和去除 5.报文读取 四.服务器端程序 五.客户端程序 一.什么是协议 协议在生活中泛指:双方或多方为了完成某项任务或达成某种目的而制定的共…...

【OpenCV实现图像:用OpenCV图像处理技巧之巧用直方图】
文章目录 概要前置条件统计数据分析直方图均衡化原理小结 概要 图像处理是计算机视觉领域中的重要组成部分,而直方图在图像处理中扮演着关键的角色。如何巧妙地运用OpenCV库中的图像处理技巧,特别是直方图相关的方法,来提高图像质量、改善细…...

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置
好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…...
js控制手机蓝牙
要使用JavaScript控制手机蓝牙,您需要使用Web Bluetooth API。这是一种新的Web API,可以让Web应用程序访问和控制蓝牙设备。 以下是一些步骤,以便您开始使用Web Bluetooth API: 检查浏览器支持:首先,您需要…...
C++11 原始字符串字面量R“()“
原始字符串字面量(Raw String Literals) R"()"是C11引入的一项特性,它允许创建不需要转义字符的字符串字面量。字符串中包含特殊字符、换行符和其他转义字符时,不需要反斜杠转义它们。 原始(Raw):不用使用反…...
【Vue原理解析】之虚拟DOM
Vue.js是一款流行的JavaScript框架,它采用了虚拟DOM(Virtual DOM)的概念来提高性能和开发效率。虚拟DOM是Vue.js的核心之一,它通过在内存中构建一个轻量级的DOM树来代替直接操作真实的DOM,从而减少了对真实DOM的操作次…...

HCIE-灾备技术和安全服务
灾备技术 灾备包含两个概念:容灾、备份 备份是为了保证数据的完整性,数据不丢失。全量备份、增量备份,备份数据还原。 容灾是为了保证业务的连续性,尽可能不断业务。 快照:保存的不是底层块数据,保存的是逻…...
【图论实战】Boost学习 01:基本操作
文章目录 头文件图的构建图的可视化基本操作 头文件 #include <boost/graph/adjacency_list.hpp> #include <boost/graph/graphviz.hpp> #include <boost/graph/properties.hpp> #include <boost/property_map/property_map.hpp> #include <boost/…...

Rust 中的引用与借用
目录 1、引用与借用 1.1 可变引用 1.2 悬垂引用 1.3 引用的规则 2、slice 类型 2.1 字符串字面量其实就是一个slice 2.2 总结 1、引用与借用 在之前我们将String 类型的值返回给调用函数,这样会导致这个String会被移动到函数中,这样在原来的作用域…...

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型
目录 一、环境准备二、Azure 机器学习中的 OpenAI 模型是什么?三、在机器学习中访问 Azure OpenAI 模型连接到 Azure OpenAI部署 Azure OpenAI 模型 四、使用自己的训练数据微调 Azure OpenAI 模型使用工作室微调微调设置训练数据自定义微调参数部署微调的模型 使用…...

XML Web 服务 Eclipse实现中的sun-jaxws.xml文件
说明 在sun-jaxws.xml文件,可以配置endpoint、handler-chain等内容。在这个文件中配置的内容会覆盖在Java代码中使用注解属性配置的的内容。 这个文件根据自己的项目内容修改完成以后,作为web应用的一部分部署到web容器中(放到web应用的WEB…...

16.1 二次根式 教学设计及课堂检测设计
课堂检测如下:...
Android数据流的狂欢:Channel与Flow
在 Android 应用程序的开发中,处理异步数据流是一个常见的需求。为了更好地应对这些需求,Kotlin 协程引入了 Channel 和 Flow,它们提供了强大的工具来处理数据流,实现生产者-消费者模式,以及构建响应式应用程序。 本文…...
Java 单元测试最佳实践:如何充分利用测试自动化
单元测试是众所周知的做法,但还有很大的改进空间!在这篇文章中,我们讨论最有效的单元测试最佳实践,包括在此过程中最大化自动化工具的方法。我们还将讨论代码覆盖率、模拟依赖关系和整体测试策略。 什么是单元测试? 单…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...