【百例RUST - 010】字符串

【百例RUST - 010】字符串

第一章 字符串定义

第01节 创建空的字符串

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let mut msg1: String = String::new();

    // 向字符串当中添加一个数据
    msg1.push_str("hello");

    // 输出数据
    println!("{}", msg1);
}

// hello

第02节 from创建字符串

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let msg2: String = String::from("hello");
 
    // 输出数据
    println!("{}", msg2);
}

// hello

第03节 str创建字符串

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let msg3: String = "helloworld".to_string();
 
    // 输出数据
    println!("{}", msg3);
}

// helloworld

第二章 字符串操作

第01节 更新字符串

案例代码,采用 push_str

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let mut msg1: String = String::from("hello");
    // 更新字符串
    msg1.push_str("world");

    let msg2: String = "rust".to_string();

    msg1.push_str(&msg2);
    // 输出数据
    println!("{}", msg1);
    println!("{}", msg2);
}

// helloworld
// rust

需要注意的是,这里的 msg1msg2 并没有失去所有权。

案例代码 采用 push

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let mut msg1: String = String::from("hello");

    // 更新字符
    msg1.push('A');
    // 输出数据
    println!("{}", msg1); 
}

// helloA

需要注意的是,上面的 push 只能采用单引号,添加一个字符,其他情况均报错

第02节 字符串的加号

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let mut msg1: String = String::from("hello");
    let mut msg2: String = "world".to_string();

    // 更新字符串
    let msg3 = msg1 + &msg2;
    // 输出数据
    // println!("{}", msg1); 
    println!("{}", msg2); 
    println!("{}", msg3); 
}

// 需要注意的是 msg1 已经失去了所有权, 将所有权交给了 msg3 所以 msg1 将无法使用!
// world
// helloworld

第03节 字符串的format

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let  msg1: String = String::from("hello");
    let  msg2: String = String::from("world");
    let  msg3: String = String::from("rust");
    let  msg : String  = format!("{}-{}-{}", msg1, msg2, msg3);

    // 输出数据
    println!("{}", msg1); 
    println!("{}", msg2); 
    println!("{}", msg3); 
    println!("{}", msg); 
}

// hello
// world
// rust
// hello-world-rust

对于 format 的解释 format!("{}-{}-{}", msg1, msg2, msg3)

复制代码
1、内存分配与返回值的问题
	format! 的工作流程,可以看作是一个 "工厂制作" 的过程。
	A、分配空间: 他会在 堆(Heap)上面开辟一块全新的内存空间。
	B、内容拷贝: 它按照你指定的格式 {}-{}-{}  将字符串 msg1, msg2, msg3 的内容拷贝到这个新的内存中。
	C、返回对象: 它会返回一个全新的 String 对象给变量 msg
	需要注意的是,这里的 msg 是一个独立的实体,修改 msg 不会影响到 msg1,  反之亦然。 它们在内存当中是完全分开的。
	
2、形象化的理解
	我们可以想象 msg1, msg2, msg3 是三本书。
	A、执行 format! 就像是拿着这三本书去  复印机上复印。
	B、复印机会根据我们的要求(中间加上横杠) 印出一本新的书 msg
	C、结果: 原本的三本书,还在我们的书架上面。(可以继续 println!) 而且我们手上多了一本缝合好的新书。

第三章 获取子字符

第01节 字符串切片

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let  msg: String = String::from("你好");
     
     // 通过索引获取字符串当中的数据
    let element = &msg[0..3];

    println!("{}", element);
}

// 你

最快。O(1) 复杂度,但若索引切断了字符会触发崩溃。 因为 UTF-8 中,中文占据 3个字节的大小

第02节 字符获取

案例代码

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let  msg: String = String::from("你好");
     
     // 通过索引获取字符串当中的数据
     let element: Option<char> = msg.chars().nth(0);
     match element {
         None => println!("数据不合法"),
         Some(x) => println!("{}", x),
     }
}

// 你

最安全。处理 Unicode 友好,但是时间复杂度较高 O(n)

第四章 字符串的遍历

第01节 字符的遍历方式

案例代码 核心函数 chars()

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let  msg: String = String::from("你好");
     
     // 采用字符的方式进行遍历 chars
     for element in msg.chars(){
        println!("{}", element)
     }
}

//  你
//  好

第02节 字节的遍历方式

案例代码 核心函数 bytes()

rust 复制代码
fn main(){
    // 创建一个空的字符串
    let  msg: String = String::from("你好");
     
     // 采用字符的方式进行遍历 bytes
     for element in msg.bytes(){
        println!("{}", element)
     }
}

//  228
//  189
//  160
//  229
//  165
//  189
相关推荐
IT_陈寒1 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
Pedantic2 小时前
SwiftUI 手势笔记
前端·后端
金銀銅鐵3 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
飘尘5 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
浏览器工程师6 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
行者全栈架构师6 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
Chenyiax6 小时前
从一次请求看懂 OkHttp:架构、调度与连接管理
后端
爱勇宝7 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
AskHarries7 小时前
工具失败时怎么办:重试、回滚、人工确认和风险提示
后端·程序员