【Rust自学】8.3. String类型 Pt.1:字符串的创建、更新与拼接

news2025/1/2 8:31:33

8.3.0. 本章内容

第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。

第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们可以动态地变大或变小。

本章主要会讲三种集合:Vector、String(本文) 和HashMap

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

8.3.1. String对开发者造成的困扰

Rust开发者(尤其是新手)会经常被字符串困扰,原因如下:

  • Rust倾向于暴露可能的错误
  • 字符串数据结构复杂
  • Rust字符串使用了UTF-8编码

8.3.2. 字符串是什么

字符串是基于字节(Byte)的集合,并且它提供了一些方法,这些方法能将字节解析为文本。

在Rust的核心语言层面,只有一个字符串类型——字符串切片str,通常是以借用的情况出现的,也就是&str

字符串切片是对存储在其他地方、utf-8编码的字符串的引用。例如字符串字面值就是直接存储在Rust的二进制文件中,所以它也是一种字符串切片。

String类型来自于标准库,而不是核心语言。它是一种可增长、可修改、可拥有(获得所有权)的类型,它也采用utf-8编码。

8.3.3. 字符串到底是指谁?

通常说的字符串就是指String&str这两种类型,而不是其中的一种。这两种类型在标准库里都用的非常频繁,也都是使用了utf-8编码,但这里主要还是讲String类型,因为它更复杂。

8.3.4. 其他的字符串类型

Rust标准库还提供了其他的字符串类型,例如:OsStringOsStrCStringCStr。但是注意这些类型都是以String或者是Str结尾,这就跟之前讲的String和字符串切片这两种类型的写法又一些关系。

通常来说,以String结尾的字符串类型是可以获得所有权的,以Str结尾的类型通常是指可借用 的。

这些不同的字符串类型可以存储不同编码的文本或是在内存中以不同的形式展现(布局不一样)。

某些library crate针对字符串可提供更多的选项,这里就不介绍了。

8.3.5. 创建一个新的字符串(String)

由于String类型的本质是字节的集合,所以很多Vec<T>的操作都可以用于String

String::new()可以用来创建一个空的字符串。看个例子:

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

但是一般而言都是使用初始值来创建String。这个时候就可以使用to_string方法来创建String,这个方法可用于实现了Display trait的类型,包括字符串字面值。如下例:

fn main() {  
    let data = "wjq";  
    let s = data.to_string();  
    let s1 = "wjq".to_string();  
}

data是一个字符串字面值,而使用to_string这个方法把它转为String类型,存储在s里。或者也可以直接写字符串字面值,然后写.to_string(),也就是给s1赋值的操作。这两个操作是同样的效果。

to_string也不是唯一的方法,第二种方法是使用String::from函数。如下例:

let s = String::from("wjq");

这个函数和to_string方法的效果是一样的。

由于字符串它用的地方非常多,所以Rust提供了很多不同的通用API供我们选择,有些函数可能看着很多余,但实际上它们都有各自的用处。而在实际编码时可以根据喜好来选择。

8.3.6. 更新String

之前提到了,String类型的大小是可以增减的,其本质是字节的集合,里面的内容也可以修改,它的操作就跟Vector一样,此外还可以对String进行拼接。

1. push_str()

首先讲push_str(),它是一个把字符串切片附加到String的方法。如下例:

fn main() {  
    let mut s = String::from("6657");  
    s.push_str("up up");  
    println!("{}", s);  
}

输出:

6657up up

push_str的签名是push_str(&mut self, string:&str),它的参数类型是借用的这个字符串切片,而字符串字面值就是切片,所以"up up"可以传进去,并且这个方法不会获得参数的所有权,所以传进去的参数不会失效,还能继续使用。

2. push

第二个方法叫push(),它能把单个字符附加到String里面。如下例:

fn main() {  
    let mut s = String::from("665");  
    s.push('7');  
    println!("{}", s);  
}

注意,字符得使用单引号。

输出:

6657

3.+

Rust允许使用+来拼接字符串。如下例:

fn main() {  
    let s1 = String::from("6657");  
    let s2 = String::from("up up");  
    let s3 = s1 + &s2;  
    println!("{}", s3);  
}

注意:加号前是字符串类型,加号后得是字符串切片类型。

但在这个例子中实际上加号后的数据类型是&String而不是&str。这时因为这里Rust使用了解引用强制转换(deref coercion) 的功能,把&String类型强制转换为&str

当然,因为s2传进去的是引用,所以s2在拼接后是仍然有效的,而s1是把本身的所有权交给了s3,所以s1在拼接后就无效了。

输出:

6657up up

4. format!

format!这个宏可以更加灵活的拼接字符串。如下例:

fn main() {  
    let s1 = String::from("cn");  
    let s2 = String::from("Niko");  
    let s3 = String::from("fan club");  
    let s = format!("{} {} {}", s1, s2, s3);  
    println!("{}", s);  
}

使用占位符来代替变量,这点和println!很像,println!是把结果进行输出,而format!则是返回了拼接好的字符串。

输出:

cn Niko fan club

当然使用+也能实现一样的效果,只不过写起来稍微麻烦一些:

fn main() {  
    let s1 = String::from("cn");  
    let s2 = String::from("Niko");  
    let s3 = String::from("fan club");  
    let s = s1 + " " + &s2 + " " + &s3;  
    println!("{}", s);  
}

format!最好的一点是它不会取得任何参数的所有权,这些参数在后续都可以继续使用。

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

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

相关文章

电子商务网站的三层架构的理解和实践

在电子商务领域&#xff0c;网站架构的设计对于系统的稳定性、可扩展性和用户体验至关重要。其中&#xff0c;三层架构作为一种经典的设计模式&#xff0c;被广泛应用于各类电子商务网站中。本文将从理论、理解和实践三个方面&#xff0c;详细探讨电子商务网站的三层架构。 一、…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…

领域驱动设计第一篇-DP主题

一&#xff1a;领域驱动设计概述 领域驱动设计。Domain-Driven Design 可以理解为基于领域的工程设计。 1&#xff1a;什么是领域&#xff1f; 初步理解领域&#xff1a;业务问题的范畴。 领域可大可小&#xff0c;对应着大小业务问题的边界。业务上要做的几个事&#xff0…

EMNLP'24 最佳论文解读 | 大语言模型的预训练数据检测:基于散度的校准方法

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 张伟超&#xff0c;中国科学院计算所网络数据科学与技术重点实验室三年级直博生 内容简介 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;的…

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…

【Webug】攻防实战详情

世界上只有一种真正的英雄主义&#xff0c;那就是认清了生活的真相后&#xff0c;仍然热爱她 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号:…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器&#xff08;View Resolver&#xff09; 来将逻辑视图名称解析为具体的视图文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…

CyclicBarrier线程辅助类的简单使用

文章目录 简述内部机制构造函数使用案例异常处理 简述 CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类&#xff0c;它允许一组线程互相等待彼此到达一个共同的屏障点&#xff08;barrier&#xff09;。与 CountDownLatch 不同的是&#xff0c;CyclicBarrier 可以…

B站推荐模型数据流的一致性架构

01 背景 推荐系统的模型&#xff0c;通过学习用户历史行为来达到个性化精准推荐的目的&#xff0c;因此模型训练依赖的样本数据&#xff0c;需要包括用户特征、服务端推荐的视频特征&#xff0c;以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流&#xff0c;即为…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

尔湾市圣诞节文化交流会成功举办,展示多元文化魅力

洛杉矶——12月21日,圣诞节文化交流会在尔湾成功举办。圣诞节文化交流会旨在促进不同文化之间的交流与理解。通过举办舞蹈表演、演讲和互动游戏等,为参与者提供了一个展示和欣赏多元文化艺术的平台。这些活动不仅增加了社区成员之间的互动,也加深了他们对不同文化传统和艺术形式…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

Spring Cloud LoadBalancer (负载均衡)

目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB) , 是高并发, 高可用系统必不可少的关…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…

安装了python,环境变量也设置了,但是输入python不报错也没反应是为什么?window的锅!

目录 问题 结论总结 衍生问题 1 第1步&#xff1a;小白python安装&#xff0c;不要埋头一直点下一步&#xff01;&#xff01;&#xff01; 2 第2步&#xff1a;可以选择删了之前的&#xff0c;重新安装python 3 第3步&#xff1a;如果你不想或不能删了重装python&#…

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

计算机网络 (13)信道复用技术

前言 计算机网络中的信道复用技术是一种提高网络资源利用率的关键技术。它允许在一条物理信道上同时传输多个用户的信号&#xff0c;从而提高了信道的传输效率和带宽利用率。 一、信道复用技术的定义 信道复用&#xff08;Multiplexing&#xff09;就是在一条传输媒体上同时传输…