Rust基本数据类型-字符串

一、字符串是什么,怎么用

1、字符串是什么

先说明一下,在Rust中,字符是UniCode编码占4个字节,字符串类型的字符是UTF-8编码的,字节大小为1~3。

字符串类型在Rust中,可以分为&Str和String类型

&Str类型是不可修改的字符串

String 则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串

2、字符串怎么用

(1)字符串不能取下标

fn main() {let s1 = String::from("hello");let h = s1[2]; 
}

这样会报错,因为字符串编码是可变长编码,通过简单的下标,很难界定你输入的下标是否正确切割了字符

 --> src/main.rs:4:14|
4 |   let h = s1[2];|              ^ `String` cannot be indexed by `{integer}`|= help: the trait `Index<{integer}>` is not implemented for `String`= help: the following other types implement trait `Index<Idx>`:<String as Index<RangeFull>><String as Index<std::ops::Range<usize>>><String as Index<RangeFrom<usize>>><String as Index<RangeTo<usize>>><String as Index<RangeInclusive<usize>>>
(2)字符串切片

如果我们就是想获得字符串的一部分,我们可以通过字符串切片来获取,但是我们的下标要注意,要整好取得字符字节大小的整数。

fn main() {let hello = "中国人";let s = &hello[0..3];println!("{}",s);
}
   Compiling world_hello v0.1.0 (/Users/guilinhuang/Desktop/RustProject/world_hello)Finished release [optimized] target(s) in 0.21sRunning `target/release/world_hello`
(3)字符串追加内容

在字符串尾部可以使用 push() 方法追加字符 char,也可以使用 push_str() 方法追加字符串字面量。这两个方法都是在原有的字符串上追加,并不会返回新的字符串。由于字符串追加操作要修改原来的字符串,则该字符串必须是可变的,即字符串变量必须由 mut 关键字修饰

fn main() {let mut s = String::from("Hello ");//mut关键字修饰,使得s拥有的值可以被修改s.push_str("rust");println!("追加字符串 push_str() -> {}", s);s.push('!');println!("追加字符 push() -> {}", s);
}
追加字符串 push_str() -> Hello rust
追加字符 push() -> Hello rust!
(4)字符串插入
  1. 由于字符串插入操作要修改原来的字符串,则该字符串必须是可变的,即字符串变量必须由 mut 关键字修饰
  2. 插入位置要求是字符的整数字节位置
fn main() {let mut s = String::from("Hello rust!");s.insert(5, ',');println!("插入字符 insert() -> {}", s);s.insert_str(6, " I like");println!("插入字符串 insert_str() -> {}", s);
}
插入字符 insert() -> Hello, rust!
插入字符串 insert_str() -> Hello, I like rust!
(5)字符串删除
  1. pop —— 删除并返回字符串的最后一个字符
    该方法是直接操作原来的字符串。但是存在返回值,其返回值是一个 Option 类型,如果字符串为空,则返回 None。 示例代码如下
fn main() {let mut string_pop = String::from("rust pop 中文!");let p1 = string_pop.pop();let p2 = string_pop.pop();dbg!(p1);dbg!(p2);dbg!(string_pop);
}
p1 = Some('!',
)
p2 = Some('文',
)
string_pop = "rust pop 中"
  1. remove —— 删除并返回字符串中指定位置的字符
    该方法是直接操作原来的字符串。但是存在返回值,其返回值是删除位置的字符串,只接收一个参数,表示该字符起始索引位置。remove() 方法是按照字节来处理字符串的,如果参数所给的位置不是合法的字符边界,则会发生错误
fn main() {let mut string_remove = String::from("测试remove方法");println!("string_remove 占 {} 个字节",std::mem::size_of_val(string_remove.as_str()));// 删除第二个汉字string_remove.remove(3);// 下面代码会发生错误// string_remove.remove(1);dbg!(string_remove);
}
string_remove 占 18 个字节
[src/main.rs:13:3] string_remove = "测remove方法"
  1. truncate —— 删除字符串中从指定位置开始到结尾的全部字符
    该方法是直接操作原来的字符串。无返回值。该方法 truncate() 方法是按照字节来处理字符串的,如果参数所给的位置不是合法的字符边界,则会发生错误
fn main() {let mut string_truncate = String::from("测试truncate");string_truncate.truncate(3);dbg!(string_truncate);
}
string_truncate = "测"
(6)字符串替换
  1. replace
    该方法可适用于 String&str 类型。replace() 方法接收两个参数,第一个参数是要被替换的字符串,第二个参数是新的字符串。该方法会替换所有匹配到的字符串。该方法是返回一个新的字符串,而不是操作原来的字符串
fn main() {let string_replace = String::from("I like rust. Learning rust is my favorite!");let new_string_replace = string_replace.replace("rust", "RUST");dbg!(new_string_replace);
}
new_string_replace = "I like RUST. Learning RUST is my favorite!"
  1. replace_range
    该方法仅适用于 String 类型。replace_range 接收两个参数,第一个参数是要替换字符串的范围(Range),第二个参数是新的字符串。该方法是直接操作原来的字符串,不会返回新的字符串。该方法需要使用 mut 关键字修饰
    要注意下标是字节的整数倍
fn main() {let mut string_replace_range = String::from("我 like rust!");string_replace_range.replace_range(0..3, "R");dbg!(string_replace_range);
}
[src/main.rs:4:3] string_replace_range = "R like rust!"
(6)字符串清除
  1. clear —— 清空字符串
    该方法是直接操作原来的字符串。调用后,删除字符串中的所有字符,相当于 truncate() 方法参数为 0 的时候。
fn main() {let mut string_clear = String::from("string clear");string_clear.clear();dbg!(string_clear);
}
string_clear = ""
(6)字符串拼接
  1. 使用 + 或者 += 连接字符串
    使用 + 或者 += 连接字符串,要求右边的参数必须为字符串的切片引用(Slice)类型。其实当调用 + 的操作符时,相当于调用了 std::string 标准库中的 add() 方法,这里 add() 方法的第二个参数是一个引用的类型。因此我们在使用 + 时, 必须传递切片引用类型
  • +是返回一个新的字符串,所以变量声明可以不需要 mut 关键字修饰
  • 左边的参数会交出所有权,后续不能再使用这个变量
fn main() {let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");// String = String + &str + &str + &str + &str
let s = s1 + "-" + &s2 + "-" + &s3;
print!("{}",s1);
}
  --> /Users/guilinhuang/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/arith.rs:91:12|
91 |     fn add(self, rhs: Rhs) -> Self::Output;|            ^^^^= note: this error originates in the macro `$crate::format_args` which comes from the expansion of the macro `print` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable|
7  | let s = s1.clone() + "-" + &s2 + "-" + &s3;|           ++++++++

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

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

相关文章

【极速前进】20240415-20240421:TR-DPO、压缩与智能的线性关系、模拟伪代码改善算术能力、Many-shot、合成数据综述

一、TR-DPO&#xff1a;更新reference模型能实现更好的对齐 论文地址&#xff1a;https://arxiv.org/pdf/2404.09656.pdf ​ 语言模型对齐的训练目标是&#xff1a; max ⁡ π θ E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ϕ ( x , y ) ] − β D KL [ π θ ( x , y ) ∥ π …

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

OSPF面试题收集

第一章:基础理论部分 基础部分面试官主要是问一些简单得原理,口头描述的东西。不会涉及到报文的参数属性等。 OSPF是什么 定义也就是链路状态协议和距离矢量协议的区别区别。 开放式最短路径优先协议 路由是以自己为根,根据数据库计算去往所有树枝节点的最佳路径放进自己…

WebSocket 快速入门 - springboo聊天功能

目录 一、概述 1、HTTP&#xff08;超文本传输协议&#xff09; 2、轮询和长轮询 3、WebSocket 二、WebSocket快速使用 1、基于Java注解实现WebSocket服务器端 2、JS前端测试 三、WebSocket进阶使用 1、如何获取当前用户信息 2、 后端聊天功能实现 一、概述 HTTP…

PVE grub resue错误修复 lvmid BUG

服务器断电后启动不起来&#xff0c;显示grub resue 找了半天没有找到修复方法。看官方文档有一处Recovering from grub “disk not found” error when booting from LVM 极为类似。https://pve.proxmox.com/wiki/Recover_From_Grub_Failure 下面是处理过程。 使用PVE 6.4启…

Leetcode算法训练日记 | day33

专题九 贪心算法 一、跳跃游戏 1.题目 Leetcode&#xff1a;第 55 题 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 …

机器学习(二)之监督学习

前言&#xff1a; 上一节大概讲解了几种学习方式&#xff0c;下面几张就具体来讲讲监督学习的几种算法。 以下示例中和都是权重的意思&#xff01;&#xff01;&#xff01; 注&#xff1a;本文如有错误之处&#xff0c;还请读者指出&#xff0c;欢迎评论区探讨&#xff01; 1…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片&#xff1a;首先&#xff0c;你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小&#xff1a;确定你希望将图片划分成的栅格大小&#xff0c;即每个栅格的宽度和高度。 3.计算栅格数量&#xff1a;根据图片的总尺寸和栅格大小&#…

搜索+剪枝,LeetCode 216. 组合总和 III

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多…

Compose 布局

文章目录 Compose 布局ColumnColumn属性使用 RowRow属性使用 BoxBox属性使用 ConstraintLayoutLazyColumnLazyColumn属性使用使用多类型使用粘性标题回到顶部 LazyRowLazyRow属性使用 LazyVerticalGridLazyVerticalGrid属性使用 Compose 布局 Column Compose中的”垂直线性布…

F-logic DataCube3 SQL注入漏洞复现(CVE-2024-31750)

0x01 产品简介 F-logic DataCube3是一款用于光伏发电系统的紧凑型终端测量系统。 0x02 漏洞概述 F-logic DataCube3 /admin/pr_monitor/getting_index_data.php 接口处存在SQL注入漏洞,未经身份验证的攻击者可通过该漏洞获取数据库敏感信息,深入利用可控制整个web服务器。 …

计算机图形学:直线生成算法—DDA

DDA&#xff08;Digital Differential Analyzer&#xff0c;数字差分分析器&#xff09;算法是一种基本的直线生成算法&#xff0c;通常用于计算机图形学中。它通过将直线划分为若干个等间隔的小线段&#xff0c;然后在每个小线段中选择一个像素点进行绘制&#xff0c;从而近似…

R-Tree:空间索引技术原理及实现详解

R-Tree&#xff1a;空间索引技术原理及实现详解 一、引言 在空间数据库中&#xff0c;如何高效地查询和处理空间数据一直是研究的热点。R-Tree作为一种重要的空间索引结构&#xff0c;在地理信息系统&#xff08;GIS&#xff09;、空间数据库管理系统等领域得到了广泛应用。本…

三十二章、Cesium从入门到精通;

一、打造第一个Cesium程序&#xff1b; 1、基础概念&#xff1b; 父子组件之间可以传递数据&#xff1a;props、回传事件&#xff1b; 使用Redux使用场景&#xff1a;兄弟&#xff1b; 2、代码样例&#xff1b; 11111111 二、Cesium基础设置&#xff1b; 三、讲解viewer…

产品原型图概念

产品原型图概念 产品原型图作用 如下图&#xff1a; 产品原型图的三种分类 线框图 通过【线段色块文字】描述产品页面。优点&#xff1a;制作快速。 缺点&#xff1a;传递信息容易遗漏。 应用&#xff1a;早期方案讨论&#xff0c;需要快速输出的场景&#xff0c;团队配合…

Java算法必备之快读

背景: 在一些算法题中,由于数据量过大,可能会出现卡输入输出时间的问题 原理: 在Java中,输入通常是使用Scanner,输出使用System.out,先说输入 Scanner in new Scanner(System.in);慢的原因有两方面: System.in在读取的时候是字节流进行读取,是一个字节一个字节读取的,在读取…

【工作杂记】groupBy排序-操作word

1.stream 流 groupBy 排序 stream流groupBy默认使用的HashMap&#xff0c;无序的&#xff0c;想要实现有序&#xff0c;需要手动指定接收的map类型 例子&#xff1a; Map<Date, List<OrderVo>> dataMap voList.stream().sorted(Comparator.comparing(OrderVo::ge…

华为OD-C卷-执行任务赚积分[100分]C++ 100%

题目描述 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。 输…

Learn ComputeShader 01 First Computer Shader

使用Unity版本&#xff1a;2019.4.12f1 整体流程&#xff1a; 1添加一个quad object并添加一个无光照材质 2.相机投影模式设置为正交 3.调整quad使其完全显示在相机内 4.创建脚本并且使用计算着色器覆盖quad的纹理 5.创建一个compute shader 前三步完成以后结果应该是这…

网络基础先导

前言&#xff1a;最好在牢固前面几大件&#xff08;编程语言、数据结构、操作系统&#xff09;&#xff0c;并且您有一个服务器的基础上&#xff08;我使用的是腾讯云中配置最低的服务器&#xff09;再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…