Rust学习笔记_08——String

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


文章目录

    • 字符串类型
      • [1. 字符串类型与字面量字符串](#1. 字符串类型与字面量字符串)
        • [1.1 字符串类型 (`String`)](#1.1 字符串类型 (String))
        • [1.2 字面量字符串 (`&'static str`)](#1.2 字面量字符串 (&'static str))
      • [2. (字符串类型)创建](#2. (字符串类型)创建)
      • [3. (字符串类型)切片](#3. (字符串类型)切片)
      • [4. (字符串类型)更新](#4. (字符串类型)更新)
      • [5. (字符串类型)遍历](#5. (字符串类型)遍历)
      • [6. (字符串类型)拼接](#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

rust 复制代码
let s1 = String::from("Hello, world!");
let s2 = "Hello".to_string();

3. (字符串类型)切片

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

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

4. (字符串类型)更新

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

rust 复制代码
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 提供了多种遍历字符串的方法,包括按字节、字符

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 分配

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

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

rust 复制代码
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = format!("{}{}", s1, s2);
相关推荐
冷凌爱32 分钟前
总结HTML中的文本标签
前端·笔记·html
保持学习ing1 小时前
黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+LinkedList)
java·笔记·算法·面试
Moonnnn.2 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr72 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen2 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
FakeOccupational3 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制
笔记·分布式·p2p
布伦鸽4 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
KENYCHEN奉孝5 小时前
基于 actix-web 框架的简单 demo
前端·rust
love530love5 小时前
【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
开发语言·人工智能·windows·笔记·python·rust·virtualenv
陳麦冬6 小时前
深入理解指针(二)
c语言·学习