【百例RUST - 010】字符串
【百例RUST - 010】字符串第一章 字符串定义第01节 创建空的字符串案例代码fnmain(){// 创建一个空的字符串letmutmsg1:StringString::new();// 向字符串当中添加一个数据msg1.push_str(hello);// 输出数据println!({},msg1);}// hello第02节 from创建字符串案例代码fnmain(){// 创建一个空的字符串letmsg2:StringString::from(hello);// 输出数据println!({},msg2);}// hello第03节 str创建字符串案例代码fnmain(){// 创建一个空的字符串letmsg3:Stringhelloworld.to_string();// 输出数据println!({},msg3);}// helloworld第二章 字符串操作第01节 更新字符串案例代码采用push_strfnmain(){// 创建一个空的字符串letmutmsg1:StringString::from(hello);// 更新字符串msg1.push_str(world);letmsg2:Stringrust.to_string();msg1.push_str(msg2);// 输出数据println!({},msg1);println!({},msg2);}// helloworld// rust需要注意的是这里的msg1和msg2并没有失去所有权。案例代码 采用pushfnmain(){// 创建一个空的字符串letmutmsg1:StringString::from(hello);// 更新字符msg1.push(A);// 输出数据println!({},msg1);}// helloA需要注意的是上面的push只能采用单引号添加一个字符其他情况均报错第02节 字符串的加号案例代码fnmain(){// 创建一个空的字符串letmutmsg1:StringString::from(hello);letmutmsg2:Stringworld.to_string();// 更新字符串letmsg3msg1msg2;// 输出数据// println!({}, msg1);println!({},msg2);println!({},msg3);}// 需要注意的是 msg1 已经失去了所有权, 将所有权交给了 msg3 所以 msg1 将无法使用// world// helloworld第03节 字符串的format案例代码fnmain(){// 创建一个空的字符串letmsg1:StringString::from(hello);letmsg2:StringString::from(world);letmsg3:StringString::from(rust);letmsg:Stringformat!({}-{}-{},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节 字符串切片fnmain(){// 创建一个空的字符串letmsg:StringString::from(你好);// 通过索引获取字符串当中的数据letelementmsg[0..3];println!({},element);}// 你最快。O(1) 复杂度但若索引切断了字符会触发崩溃。 因为 UTF-8 中中文占据 3个字节的大小第02节 字符获取案例代码fnmain(){// 创建一个空的字符串letmsg:StringString::from(你好);// 通过索引获取字符串当中的数据letelement:Optioncharmsg.chars().nth(0);matchelement{Noneprintln!(数据不合法),Some(x)println!({},x),}}// 你最安全。处理 Unicode 友好但是时间复杂度较高 O(n)第四章 字符串的遍历第01节 字符的遍历方式案例代码 核心函数chars()fnmain(){// 创建一个空的字符串letmsg:StringString::from(你好);// 采用字符的方式进行遍历 charsforelementinmsg.chars(){println!({},element)}}// 你// 好第02节 字节的遍历方式案例代码 核心函数bytes()fnmain(){// 创建一个空的字符串letmsg:StringString::from(你好);// 采用字符的方式进行遍历 bytesforelementinmsg.bytes(){println!({},element)}}// 228// 189// 160// 229// 165// 189