Rust学习笔记_08——String

Rust学习笔记_05——控制流(1)
Rust学习笔记_06——控制流(2)
Rust学习笔记_07——枚举和范围


文章目录

    • 字符串类型
      • 1. 字符串类型与字面量字符串
        • 1.1 字符串类型 (`String`)
        • 1.2 字面量字符串 (`&'static str`)
      • 2. (字符串类型)创建
      • 3. (字符串类型)切片
      • 4. (字符串类型)更新
      • 5. (字符串类型)遍历
      • 6. (字符串类型)拼接

字符串类型

Rust 语言中的字符串类型是其数据类型的核心部分之一,用于处理文本数据。Rust 的字符串类型提供了高效且安全的方式来操作文本。在 Rust 中,字符串是不可变的(immutable)默认情况下,但可以声明为可变(mutable)。Rust 使用 UTF-8 编码来处理字符串,这意味着它可以处理几乎任何语言的字符。

1. 字符串类型与字面量字符串

字符串类型和字面量字符串是两个不同的概念,尽管它们都与文本数据相关,但它们在内存管理、可变性和用途上有所不同。

1.1 字符串类型 (String)
  1. 内存管理String 类型是一个堆分配(heap-allocated)的字符串,这意味着它可以在运行时动态地增长和缩小。它负责自己分配的内存,并在不再需要时自动释放(通过 Rust 的所有权系统)。
  2. 可变性:默认情况下,String 是可变的(尽管你可以通过引用使其不可变)。这意味着你可以修改它的内容,例如添加、删除或替换字符。
  3. 用途String 通常用于需要在运行时构建、修改或存储文本数据的场景。
  4. 所有权String 拥有它所包含的数据,并且遵循 Rust 的所有权规则。当 String 超出作用域或被显式丢弃时,它所拥有的内存将被释放。
1.2 字面量字符串 (&'static str)
  1. 内存管理:字面量字符串是静态分配的(statically allocated),这意味着它们在编译时就被确定并存储在程序的二进制文件中。它们通常被存储在只读内存段中。
  2. 不可变性:字面量字符串是不可变的。你不能修改它们的内容。
  3. 用途:字面量字符串通常用于定义常量文本,如函数参数、配置值或硬编码的消息。由于它们是编译时常量,因此非常适合用于这些场景。
  4. 借用和生命周期:字面量字符串被表示为对静态分配内存的不可变借用(&'static str)。这里的 'static 生命周期表示这个借用与整个程序的生命周期一样长,因为字面量字符串在程序运行期间始终存在。

2. (字符串类型)创建

你可以使用 String::from 函数或 to_string 方法从字符串字面量或其他类型的字符串表示中创建 String

let s1 = String::from("Hello, world!");
let s2 = "Hello".to_string();

3. (字符串类型)切片

字符串切片是对字符串的某一部分的不可变引用。字符串切片是 UTF-8 编码的,并且通常从字符串字面量或 String 中获得。字符串切片是轻量级的,因为它们不拥有数据.

let s = String::from("Hello, world!");
let slice = &s[0..5]; // 创建一个指向 "Hello" 的切片

4. (字符串类型)更新

由于 String 是可增长的,可以通过方法如 push_strpush 来修改它

let mut s = String::from("Hello, ");let s2 = String::from("world!22");s.push_str("world!");let hello = "Hello: ";// s.push(hello); // 注意:这里会编译失败,因为 `hello` 是不可变的,而 `push` 需要一个可变的 `&str`// 正确做法:let hello_mut: &mut str = &mut "Hello: ".to_string(); // 这行代码在实际代码中是不常见的,只是为了说明// s.push(hello_mut); // 这行代码也是不正确的,因为 `hello_mut` 的生命周期很短// 正确的更新方式是使用 `format!` 宏或其他字符串处理方法:s.push('\n');s.push_str("Hello: ");s.push_str(&s2);println!("{}", s);

输出结果

Hello, world!
Hello: world!22

5. (字符串类型)遍历

Rust 提供了多种遍历字符串的方法,包括按字节、字符

let text = String::from("hello 你好");// 按字节遍历
for byte in text.bytes() {print!("{:02x} ", byte);
}
println!();// 按字符遍历(注意:这可能不是 Unicode 感知的)
for char in text.chars() {print!("'{}' ", char);
}
println!();

6. (字符串类型)拼接

你可以使用 + 操作符来拼接两个 String 值,但注意这会创建一个新的 String 分配

let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; 
// 注意:这里 &s2 是必要的,因为 `+` 需要一个 `&String`(即 `&str`)和一个 `String`

更常见的做法是使用 format! 宏,它提供了更强大和灵活的字符串格式化功能

let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = format!("{}{}", s1, s2);

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

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

相关文章

【HarmonyOS学习日志(11)】计算机网络之概念,组成和功能

文章目录 计算机网络概念计算机网络,互连网与互联网的区别计算机网络互连网互联网(因特网,Internet) 计算机网络的组成和功能计算机网络的组成从组成部分看从工作方式看从逻辑功能看 计算机网络的功能数据通信资源共享分布式处理提…

winform跨线程更新界面

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#程序的时候,有时候需要在非Ui主线程更新界面,为了…

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能: 运行方式:推荐使用第二种方法 变量类型 字符串处理: 条件判断:(使用echo $?来判断条件结果,0为true,1为false) 条件语句&a…

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注(Sequence Tagging)二、命名实体识别(Named Entity Recognition,NER)**命名实体识别的作用****命名实体识别的常见实体类别** : 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…

wareshark分析mysql协议的数据包

使用wareshark 分析mysql协议的数据包,是每个dba都应该掌握的技能,掌握以后,就可以通过tcpdump抓包分析,得到连接报错的信息了。 tcpdump抓包命令: tcpdump -nn -i bond0 dst 10.21.6.72 and port 4002 -w 1129_tcpdu…

Shell脚本小练习

学习了这么长时间Shell脚本,总得来一次小小的练习吧,那么请看下文! 1.用Shell写一个小计算器。 通过read命令获取用户输入的表达式,表达式的格式设定为操作数1 运算符 操作数2,例如53,然后利用设计的脚本…

leetcode102:二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: 输入&a…

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)

文章目录 1. 最近最久未使用算法的工作原理2. 最近最久未使用算法示例3.LRU算法实现3.1 LRU的页面链表实现3.2 LRU的活动页面栈实现3.3 链表实现 VS 堆栈实现 1. 最近最久未使用算法的工作原理 最近最久未使用页面置换算法,简称 LRU, 算法思路&#xff…

3. STM32_串口

数据通信的基础概念 什么是串行/并行通信: 串行通信就是数据逐位按顺序依次传输 并行通信就是数据各位通过多条线同时传输。 什么是单工/半双工/全双工通信: 单工通信:数据只能沿一个方向传输 半双工通信:数据可以沿两个方向…

Postman设置接口关联,实现参数化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…

Redis设计与实现 学习笔记 第二十二章 二进制位数组

Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。 SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始,而二进制位的值可以是0或1&…

Linux服务器安装Linux宝塔面板部署wordpress网站以及雷池WAF

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程,保证网站能够正常访问,并且使用Linux宝塔面板申请并部署了SSL证书,使用https协议正常访问。 三、Linux宝塔…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要:本文将对两道LeetCode原题进行介绍,分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中,import 语句用于在当前文件中导入其他 Sass 文件,以便你可以重用样式和变量等。然而,从 Dart Sass 1.23.0 版本开始,import 语句已经被标记为弃用(deprecated),并计划在未来的…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能,自己研究了下。 1.其中向量角度计算: 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向,从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示(RSSI)原理的蓝牙定位程序,专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内,通过4个锚点实现对未…