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

007 Rust字符串

Rust字符串有两种类型:String&str

  • String :字符串,可以对字符串进行修改、追加等操作。
  • &str : 字符串切片,是一种引用类型,是无法修改字符串的内容。

String

可增长的、可变的、在堆上分配的字符串类型。当你需要拥有并修改字符串数据时使用。

let mut s = String::from("Hello");
s.push_str(", world!"); // 修改字符串
println!("{}", s); // 输出: Hello, world!

String字符串常见操作
1、创建 String

// 从字符串字面量创建
let s1 = String::from("Hello");
let s2 = "Hello".to_string(); // 同上,两种方式等价// 新建空字符串然后推送数据
let mut s3 = String::new();
s3.push_str("Hello");
s3.push('!'); // 推送单个字符

2、字符串拼接
有多种方式可以拼接字符串:
(1)使用 +运算符或 format!宏(推荐 format!用于复杂拼接):

// 使用 + 拼接
let s1 = String::from("Hello");
let s2 = String::from("world");
let s3 = s1 + " " + &s2; // 注意:s1 的所有权被移动,后续不能再使用 s1// 使用 format!,不会获取任何变量的所有权
let s1 = String::from("Hello");
let s2 = String::from("world");
let s3 = format!("{} {}!", s1, s2); // s1 和 s2 仍然可用

(2)使用 push_str方法:

let mut s = String::from("Hello");
s.push_str(" world");

注意: Rust 的字符串不支持直接通过索引(如 s[0])访问字符。这是因为字符串是 UTF-8 编码的,一个字符可能由多个字节组成,直接索引无法保证总是返回一个有效的 Unicode 标量值。

替代方案是使用迭代:

let s = "Здравствуйте";// 遍历字符,.chars()方法:该方法返回一个迭代器,可以遍历字符串的Unicode字符。
for c in s.chars() {println!("{}", c);
}// 遍历字节,.bytes()方法:该方法返回一个迭代器,可以遍历字符串的字节序列。
for b in s.bytes() {println!("{}", b);
}// 获取第 n 个字符(效率较低,因为需要从头遍历)
if let Some(c) = s.chars().nth(2) {println!("第三个字符是: {}", c);
}

&str(字符串切片)

&str是一个不可变的引用,指向某个字符串的片段(可以是 String的切片,也可以是字符串字面量)。

let s = String::from("Hello, world!");
let hello = &s[0..5]; // hello 是一个 &str,指向 s 的一部分
let world = &s[7..12];// 字符串字面量也是 &str
let literal: &str = "Hello";

使用切片语法需要小心,必须保证切片的边界是字符的边界(UTF-8 编码边界),否则程序会在运行时 panic。

字符串字面量
字符串字面量(如 “Hello”)的类型是 &'static str。它是一个指向程序二进制文件中预分配文本的切片,因此在程序的整个生命周期内都有效。

提示:

  • 在函数中接收字符串参数时,通常使用 &str以获得最大的灵活性(既可以传递 String,也可以传递字符串字面量)。
  • 当你需要拥有字符串数据或需要修改它时,使用 String。
  • 处理用户输入或需要构建字符串时,使用 String。
  • 记住字符串是 UTF-8 编码的,直接索引访问不被允许,需要使用 chars()或 bytes()方法进行迭代。

文章转载自:

http://PPfcZao1.rmxwm.cn
http://zcroWUgT.rmxwm.cn
http://T7b27lFk.rmxwm.cn
http://2qoPBjV4.rmxwm.cn
http://ycKxzbeN.rmxwm.cn
http://pejmQAPt.rmxwm.cn
http://AGI6w9Zb.rmxwm.cn
http://RyRNm6ky.rmxwm.cn
http://O4xQb7Cp.rmxwm.cn
http://9AdI1pJE.rmxwm.cn
http://Jpq8tQsT.rmxwm.cn
http://kHTQPIVi.rmxwm.cn
http://87rco1Us.rmxwm.cn
http://nzupw3NA.rmxwm.cn
http://uLfiCNNs.rmxwm.cn
http://L8dZ6LKF.rmxwm.cn
http://FSfWK9tZ.rmxwm.cn
http://GIyhHpIi.rmxwm.cn
http://ZQ9cjp4M.rmxwm.cn
http://b4affokZ.rmxwm.cn
http://7YwoIwob.rmxwm.cn
http://QM4LQj8v.rmxwm.cn
http://s264Nfeo.rmxwm.cn
http://sUe8cJoY.rmxwm.cn
http://ldVARUxu.rmxwm.cn
http://CW48oCXj.rmxwm.cn
http://0LR1KhoX.rmxwm.cn
http://jxgHHJaj.rmxwm.cn
http://FraGyjAe.rmxwm.cn
http://bImtZDGr.rmxwm.cn
http://www.dtcms.com/a/388119.html

相关文章:

  • 使用 Compose 部署 WordPress
  • Golang语言入门篇006_关键字与保留字详解
  • Class60 Transformer
  • Redis 线上故障案例分析:从救火到防火的实战指南
  • uv虚拟环境起名
  • YASKAWA安川机器人铝材焊接节气之道
  • 2025 AIME Benchmark:AI 在奥数领域的最新进展
  • 【ubuntu24.04】删除6.14内核升级6.11.0-29-generic内核nvidia驱动535到550
  • nvm下载低版本node
  • Day44 51单片机UART串行通信 软件模拟UART + 硬件UART回显
  • Freertos系列(调度机制与创建任务)
  • 深度学习(二)
  • 搭建node脚手架(六) ESLint 功能模块
  • mysql面试(2)
  • Linux系统DNS服务
  • 如何通过跳板机访问内网 Mysql 服务器
  • SSH 远程连接内网 Linux 服务器
  • Spring Cloud - 微服务监控
  • Flutter-[1]入门指导
  • Linux服务器运维自动化巡检工具
  • Java 大视界 -- Java 大数据在智能家居设备联动与场景化节能中的应用拓展(413)
  • Node.js 部署:PM2 的 Fork 与集群模式
  • 【C++上岸】C++常见面试题目--网络篇(第二十五期)
  • LangChain使用方法以OpenAI 的聊天模型GPT-4o为例
  • CephFS存储文件系统介绍
  • Java Swagger2 能显示页面但看不到一个接口
  • SSL证书有效期缩短:自动化解决方案
  • C# 多线程编程 (.NET Framework 4.0)
  • 一个手艺活 - 跨语言编程
  • docker安装ollama、下载模型详细步骤