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

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 类型的值返回给调用函数&#xff0c;这样会导致这个String会被移动到函数中&#xff0c;这样在原来的作用域…...

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型

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

XML Web 服务 Eclipse实现中的sun-jaxws.xml文件

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

16.1 二次根式 教学设计及课堂检测设计

课堂检测如下&#xff1a;...

Android数据流的狂欢:Channel与Flow

在 Android 应用程序的开发中&#xff0c;处理异步数据流是一个常见的需求。为了更好地应对这些需求&#xff0c;Kotlin 协程引入了 Channel 和 Flow&#xff0c;它们提供了强大的工具来处理数据流&#xff0c;实现生产者-消费者模式&#xff0c;以及构建响应式应用程序。 本文…...

Java 单元测试最佳实践:如何充分利用测试自动化

单元测试是众所周知的做法&#xff0c;但还有很大的改进空间&#xff01;在这篇文章中&#xff0c;我们讨论最有效的单元测试最佳实践&#xff0c;包括在此过程中最大化自动化工具的方法。我们还将讨论代码覆盖率、模拟依赖关系和整体测试策略。 什么是单元测试&#xff1f; 单…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...