Rust学习总结之String

news/2024/5/17 1:29:30/文章来源:https://blog.csdn.net/qq_27071221/article/details/129768069

        有编程经验的相信没少和字符串打交道,无论是C/C+,还是现在比较流行的Python,字符串都是用的非常多的类型。在Rust中字符串类型同样有举足轻重的作用,几乎编码都离不开字符串。下面将详细学习Rust中的String类型。

一:创建字符串

fn main() {let mut name_str = String::new();
}

         我们用String的new函数来创建一个空的字符串name_str,这时候字符串里面没有任何内容,你可以理解name_str就是一个字符串的对象。接下来你就可以对name_str进行字符串方法的一系列调用。

        当然我们也可以在创建的同时对字符串进行初始化

fn main() {let name_str = String::from("ftz");println!("the name is {}",name_str);
}

        也可以用to_string方法,将字符串字面值转换成字符串类型

fn main() {let data = "ftz";let s = data.to_string();// 该方法也可直接用于字符串字面量:let s = "ftz".to_string();
}

         就像开头所说字符串的使用非常频繁和广泛,在Rust中实现了很多不同的用于字符串的通用 API 可供编码者选择。其中一些可能看起来多余,不过都有其用武之地!在这个例子中,String::from 和 to_string 最终做到了完全相同的事情,所以如何选择,就是风格问题了。我个人更倾向于使用String::from,这个看起来血脉更纯,更Rust

二:更新字符串

        字符串创建后,一般都不是原模原样的从头用到尾,也是有需求在流程中对字符串进行更新,这里的更新就包括对源字符串的拼接,删除,格式化

1,push_str方法拼接字符串

fn main() {let mut my_name = String::from("Fei");my_name.push_str(" tz");println!("my name is {}",my_name);
}

运行结果:

 在这里也需要注意一下push_str并不获取括号内变量的所有权

fn main() {let mut my_name = String::from("Fei");let sec_name = " tz";my_name.push_str(" tz");println!("my name is {}",my_name);println!("second name is {}",sec_name);
}

运行结果:

可以看到我们打印出来了sec_name。 

2,push方法拼接单个字符

fn main() {let mut my_name = String::from("ft");let last_name = 'z';my_name.push(last_name);println!("my name is {}",my_name);println!("last name is {}",last_name);
}

运行结果:

可以看到push方法同样也不会获得括号内变量的所有权 

3,使用'+'号拼接字符串

        在Rust中使用'+'号拼接字符串的用法还是让我吃惊了一把,学到现在个人感觉Rust相对于Python还是比较刻板,对于这种在Python中常见的字符串拼接用法出现在Rust中还是比较惊喜的。

fn main() {let first_name = String::from("Fei");let last_name = String::from(" tz");let my_name = first_name + &last_name;println!("my name is {}",my_name);println!("last name is {}",last_name);
}

运行结果:

         需要注意的是用'+'号去拼接字符串,在相加后first_name便丧失了所有权,后续不能再使用first_name变量了。从使用中也可以看到被加的last_name用的是引用,不会丧失所有权,后面还可以正常使用

4,使用format!宏拼接字符串

如果想要级联多个字符串,+ 的行为就显得笨重了:

let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");let s = s1 + "-" + &s2 + "-" + &s3;

对于比较长且多次的拼接可以使用format!宏来实现,更加简洁直观

let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");let s = format!("{}-{}-{}", s1, s2, s3);

        这个就类似于C语言中的snprintf函数来格式化的拼接字符串,另外利用format!宏来拼接字符串并不会获取所有要拼接字符串的所有权。

三:索引字符串

如果我们想要获取字符串中的某个字符,第一想到的是能不能像数组一样通过下标索引去访问。

fn main() {let first_name = String::from("Fei");println!("my name is {}",first_name[0]);
}

运行结果:

 可以看到在Rust中并不支持用下标去访问字符串中的字符。如果我们想要访问字符串中的某个字符或者一段字符可以通过切片的方式

fn main() {let first_name = String::from("Fei");println!("my name is {}",&first_name[0..2]);
}

运行结果:

 用切片去访问字符串的时候需要注意的是切片的长度必须是字符串单个字符的整数倍

fn main() {let first_name = String::from("您好");println!("my name is {}",&first_name[0..1]);
}

运行结果:

 可以看到程序报错了,因为一个汉字在Rust中是3个字节,切片一个字节的话程序不知道怎么返回,只能3个字节并且在边界上才可以

四:遍历字符串

我们可以用for循环在遍历字符串

fn main() {let hello = String::from("您好呀");for sig in hello.chars(){println!("{}",sig);}
}

运行结果:

        对于字符串的遍历最好的选择是使用 chars 方法。对中文字符串调用 chars 方法会将其分开并返回单个汉字char 类型的值,接着就可以遍历其结果来访问每一个元素了,这时候就不用烦恼字符串中的单个字符所占的字节数了

        假如你想获取字符串在内存中字节值,可以用bytes方法去遍历字符串的每一个字节值

fn main() {let hello = String::from("您好呀");for sig in hello.bytes(){println!("{}",sig);}
}

运行结果:

      

五:总结

        从上面可以看到在Rust中字符串的使用相比较于Python条条框框还是相当多的,刚上手就觉得字符串的处理比较繁琐,但是这也相当程度上避免了处理字符串过程中会出现的潜在的错误。还是那句话学好Rust不容易。

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

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

相关文章

微信小程序——API promise化,全局数据共享,MobX,将Stroe中的成员绑定到页面中,在页面上使用Strore中的成员

一.API promise化1.基于回调函数的异步 API 的缺点默认情况下,小程序官方提供的异步 API 都是基于回调函数实现的,例如,网络请求的 API 需要按照如下的方式调用:缺点:容易造成回调地狱的问题,代…

25种代码坏味道总结

前言 什么样的代码是好代码呢?好的代码应该命名规范、可读性强、扩展性强、健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦 1. Duplicated Code (重复代码) 重复代码就是不同地点,有着相同…

为什么保存按钮那么像自动售货机?

高中生 Every Highschool Senior: I can’t wait to move out and go to college and Be on my Own. 每一个高中毕业生: 我等不及离开去大学,独立自我。 Everyone in College: 大学里的每个人: 评论区 Stoovin: The real world sucks. But…

LD_PRELOAD劫持(超详细篇)

目录 前提知识 环境变量 链接 LD_PRELOAD LD_LIBRARY_PATH ELF文件 /bin、/sbin、/usr/sbin、/usr/bin 漏洞复现 案例一(随机数劫持) 案例二(ls的劫持) 案例三(__attribute__&LD_PRELOAD劫持) 案例四(利用 LD_PRELOAD 绕过 Disable_Functions) 案例五(利用 er…

小白学Pytorch系列--Torch.nn API Pooling layers(3)

小白学Pytorch系列–Torch.nn API (3) 方法注释nn.MaxPool1d对由多个输入平面组成的输入信号应用1D最大池化。nn.MaxPool2d对由多个输入平面组成的输入信号应用二维最大池化。nn.MaxPool3d在由多个输入平面组成的输入信号上应用3D最大池化。nn.MaxUnpool1d计算MaxPool1d的偏逆。…

Zookeeper3.5.7版本—— Curator框架实现分布式锁案例

目录一、Zookeeper原生的 Java API 存在的问题二、Zookeeper原生的 Java API 存在问题的解决方式三、Curator框架实现分布式锁示例代码3.1、pom文件添加依赖3.2、示例代码3.3、Curator框架实现分布式锁测试一、Zookeeper原生的 Java API 存在的问题 会话连接是异步的&#xff…

Kubernetes为容器和 Pods 分配 CPU 资源

Kubernetes为容器和 Pods 分配 CPU 资源 一、指定CPU请求和CPU限制 1、创建一个命名空间(namespace) [rootmaster ~]# kubectl create namespace cpu-example namespace/cpu-example created2、编写yaml文件 要为容器指定CPU请求,需要在容…

STC32G 比较器及其应用编程

一 STC32G系列单片机寄存器简介STC32G系列单片机内部集成了一个比较器,其正极可以在P3.7、P5.0、P5.1、或者ADC的模拟输入通道间切换;而负极可以是P3.7或者内部BandGap经过OP的REF电压。通过配置分时复用可以实现多个比较器的应用。STC32G系列单片机的比…

MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容

写在前面 本文是在学习MySQL数据库时整理的笔记,可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key12e4a7324f68371db3984d93e26e458962a4f0bc188ec23ec70637a4f3b4d58f 笔记基础上增加了一些内容以及后续的锁、InnoDB引擎等内容 课程参考b站黑…

Java数据结构与算法----搜索篇(DFS与BFS)

一.概念DFS(Depth First Search)深度优先搜索 和BFS(Breadth First Search)广度优先搜索 是两种广泛应用于搜索和遍历算法中的基本技术。这两种算法都涉及到搜索数据结构中的节点 。这里我们以二叉树为例,简单地图解一…

实验九 TSP问题

《算法设计与分析》实验报告 所在院系 计算机与信息工程学院 学生学号 学生姓名 年级专业 2020级计算机科学与技术 授课教师 彭绪富 学 期 2022-2023学年第一学期 提交时间 2022年10月26日 目 录 实验九-1:TSP问题 一、实验目的与要求 二…

【图解http】

目录了解web及网络基础TCP/IP协议族与HTTP关系密切的协议:IP、TCP和DNS各种协议与HTTP协议的关系URI和URLhttp协议HTTP是不保存状态的协议请求URI定位资源告知服务器意图的HTTP方法持久连接节省通信量HTTP报文编码提升传输速率压缩传输的内容编码分割发送的分块传输…

关于参加新星计划的收获

目录 作者简介 前言 一、新星计划介绍 二、新星计划创作目标 (一)创作打卡阶段第1周(3/13-3/19) (二)创作打卡阶段第2周(3/20-3/26) 三、参赛文章的构思与创作 &#xff08…

Go map 内存泄露

前言 在Go中, map这个结构使用的频率还是比较高的. 其实在所有的语言中, map使用的频率都是很高的. 之前在使用中, 一直都知道map的内存在元素删除的时候不会回收, 但一直没有仔细的研究为什么. 今天就来好好揣摩揣摩. func main() {m : make(map[int][128]byte)for i : 0; …

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样,小程序适配优化。接口免费。小程序不是网页 修改教程: 1,如果想修改或者去除水印,直接删除或修改“index.html”12~22行 2,如果想修改logo,直接…

“全球首款旗舰”填补行业空白,两轮电动车技术创新为何只看绿源?

作者 | 曾响铃 文 | 响铃说 乒乓作为我们的“国球”,在数不清的体育赛事里书写辉煌战绩,也进一步被国人熟知、热爱。更难能可贵的是“国球”精神:“别人可能练了一千次,而我们却练了一万次”,冠军品质,奋…

MYSQL【基础篇】MYSQL 主要函数

MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数 ​MySQL函数是MySQL数据库提供的内部函数。这些内部函数可以帮助用户更加方便的处理表中的数据 MySQL函数可以对表中数据进行相应的处理,以便得到用户希望得到的数据。这些函…

JAVA Session会话 Thymeleaf - 视图模板技术配置步骤

JAVAWebSession会话会话跟踪技术session保存作用域Thymeleaf - 视图模板技术配置过程Session会话 HTTP是无状态的:服务器无法区分这两个请求是同一个客户端发过来的,还是不同的客户端发过来的 现实问题:第一次请求是添加商品到购物车&#x…

C++中的string类【详细分析及模拟实现】

string类 目录string类一、stirng的介绍及使用1.为什么学习string类?2.标准库中的string类2.1 引入:编码2.2 basic_string3.string类的使用3.1 构造函数3.2 遍历string方式1:for循环方式2:范围for4.迭代器4.1 正向迭代器4.2反向迭…

Golang流媒体实战之二:回源

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 今天的实战是流传输过程中的常见功能:回源如下图,lal(源站)和lal(拉流节点)代表两台电脑,上面都部署了lalVLC在…