Rust 学习笔记, Rust 教程
往期回顾:
Rust学习笔记-1 Rust 介绍.
Rust 学习笔记-2 环境安装
Rust学习笔记-2.1 rustup 镜像加速,飞起
Rust 学习笔记-3 Hello World
Rust学习笔记-4 Rust 基础数据类型
Rust 学习笔记-5 变量与常量
![ebf14254b1d02c9f5c46d2b943ec0b27.png](https://i-blog.csdnimg.cn/blog_migrate/34a812bf80b48f7fd2998619551ff13e.jpeg)
rust 学习笔记6-字符串
Rust 中的String类型可以分为2类.
- 字符串文本(&str)
- 字符串对象(String)
字符串文本
当字符串的值在编译时已知时,使用字符串文本(&str)。这些字符被编码成一个硬字符集。例如,让company=“my company”。字符串文本位于模块std::str中。字符串文本也称为字符串切片.
这实际上跟c语言里面的字符数组一个概念.
例子:
fn demo19() { let company: &str = "my company"; let location: &str = "guangdong"; println!("company is : {} location :{}", company, location);}fn main() { demo19();}
默认情况下,字符串文字是静态的。这意味着字符串文本在整个程序期间都是有效的.
fn demo20() { let company: &'static str = "my company"; let location: &'static str = "guangdong"; println!("company is : {} location :{}", company, location);}fn main() { demo20();}
上面2段程序输出的结果是一样的.
Finished dev [unoptimized + debuginfo] target(s) in 0.48s Running `targetdebughello-world.exe`company is : my company location :guangdong
字符串对象(String Object).
标准库中提供了字符串对象类型。与字符串文本(string literal)不同,string对象类型不是核心语言的一部分。它被定义为标准库pub struct String中的公共结构。字符串是一个可增长的集合。它是可变的UTF-8编码类型。字符串对象类型可用于表示在运行时提供的字符串值。字符串对象在堆中分配。实际上是一个vector.
语法:
创建一个字符串对象.
String::new()
创建一个空白字符串对象.
String::from()
是不是感觉有点java的味道.
fn demo21() { let empty_string = String::new(); println!("length is {}", empty_string.len()); let content_string = String::from("my string"); println!("length is {}", content_string.len());}fn main() { demo21();}
第一个empty_string 创建了一个空白的字符串对象. 第二个从字符串文本创建一个字符串对象.
cargo run
![4642bb0ef39bb9cb22542c2208ee2d37.png](https://i-blog.csdnimg.cn/blog_migrate/ae50239859f534aea2e0fb93883add94.jpeg)
字符串常用方法
![33db4e02117fc62133f068bb5d8c35d5.png](https://i-blog.csdnimg.cn/blog_migrate/73300c20a4dd33adce9f018b11d9d4f3.jpeg)
new()
例如:
fn demo22() { let mut z = String::new(); z.push_str("hello"); println!("{}", z);}
cargo run:
![fdc25b2a7a780f0746b5e4fa0a46b524.png](https://i-blog.csdnimg.cn/blog_migrate/eb3ccc9cf71a9f26682170207bd9654e.jpeg)
rust 学习笔记-6 demo22
to_string()
栗子:
fn demo23() { let name1 = "Hello World Hello!".to_string(); println!("{}", name1);}fn main() { demo23();}
cargo run:
![ccfbc2506392d5a8217984753b574104.png](https://i-blog.csdnimg.cn/blog_migrate/65c3062aca85d107ec48f2ff3f3e16a9.jpeg)
replace()
replace()函数接受两个参数,
第一个参数是要搜索的字符串模式,
第二个参数是要替换的新值。
看下面的的示例中,Hello在name1字符串中出现两次
fn demo24() { let name1 = "Hello Rust, Hello!".to_string(); //字符串对象 let name2 = name1.replace("Hello", "Hi"); //查找并替换. println!("{}", name2);}fn main() { demo24();}
cargo run:
![d516af13d4400cbccd8e68cb77b98fcf.png](https://i-blog.csdnimg.cn/blog_migrate/b45abf39e7d9e8d8542a4e7aa9a40399.jpeg)
as_str()
提取包含整个字符串的字符串切片,直接将String对象转换成了字符数组了.
fn demo25() { let example_string = String::from("示例字符串,哈哈"); print_literal(example_string.as_str());}fn print_literal(data: &str) { println!("displaying string literal {}", data);}fn main() { demo25();}
cargo run:
![ed0e070b369bafbbb14475083b628a97.png](https://i-blog.csdnimg.cn/blog_migrate/47e81e6a21b9019bfec303c462410abf.jpeg)
rust 学习笔记-6 demo25
push()
将给定的字符追加到字符串的末尾
栗子:
fn demo26() { let mut company = "Tutorial".to_string(); company.push('s'); println!("{}", company);}fn main() { demo26();}
cargo run:
![ea9ea6c1ecefc23c1ca7b8f695991d56.png](https://i-blog.csdnimg.cn/blog_migrate/712803f549dad95a2a5273f6cd534f98.jpeg)
len()
len()返回字符总数包括空格.
fn demo27() { let fullname = " Tutorials"; println!("length is {}", fullname.len());}fn main() { demo27();}
cargo run:
![d2aaefa5d0f199662c27dc801da1657d.png](https://i-blog.csdnimg.cn/blog_migrate/db3d012568fa84e55ace63d34ec1118f.jpeg)
trim()
去掉字符串前后的空格. 不会去掉中间的空格.
fn demo28() { let fullname = " Rust is Good! "; println!("Before trim "); println!("length is {}", fullname.len()); println!(); println!("After trim "); println!("length is {}", fullname.trim().len());}fn main() { demo28();}
cargo run:
![b7cc9220ffb9358cede5941b31d0063f.png](https://i-blog.csdnimg.cn/blog_migrate/78b08781aba0e99b1d47a5bcd5f1704c.jpeg)
split_whitespace()
split_whitespace() 输入字符串拆分为不同的字符串。它返回一个迭代器. 所以只要循环这个迭代器每个元素. 如下例:
fn demo29() { let msg = "Rust is a good programing language".to_string(); let mut i = 1; for token in msg.split_whitespace() { println!("token {} {}", i, token); i += 1; }}fn main() { demo29();}
cargo run
![a880397999668fc15f82c613629b3c61.png](https://i-blog.csdnimg.cn/blog_migrate/a75b0e9dda4de62e09ea3a2b3c734d0d.jpeg)
split()
string()返回模式匹配的字符分割的字符串迭代器。 split()方法的局限性是无法存储结果以供以后使用。collect方法可用于将split()返回的结果存储vector.
fn demo30() { let fullname = "张全蛋,李子柒,王二"; for token in fullname.split(",") { println!("token is {}", token); } println!(""); let tokens: Vec = fullname.split(",").collect(); println!("第一 {}", tokens[0]); println!("第二 {}", tokens[1]); println!("第三 {}", tokens[2]);}fn main() { demo30();}
cargo run:
![b985f0456e59478eda9c833e8736f6e4.png](https://i-blog.csdnimg.cn/blog_migrate/3c803983ac7d95fe11e9bcc0c0c3c82d.jpeg)
用 "+" 运算符 连接字符串
字符串可以通过+ 连接起来. 其实就是把后一个加到前一个里面去.
fn demo31() { let n1 = "Hello ".to_string(); let n2 = "Rust".to_string(); let n3 = n1 + &n2; // n2 是引用. println!("{}", n3);}fn main() { demo31();}
cargo run:
![d65f3d0905cd444e3d66a5155d261c51.png](https://i-blog.csdnimg.cn/blog_migrate/dc9da8400b278b2ee331805ad174f0de.jpeg)
类型转换
比如将整数转成字符串.
fn demo32() { let number = 2020; let number_as_string = number.to_string(); // 转换数字到字符串. println!("{}", number_as_string); println!("{}", number_as_string == "2020");}fn main() { demo32();}
cargo run:
![f4074dc2374ae416de970bada870a2c4.png](https://i-blog.csdnimg.cn/blog_migrate/22193eb8d64edcf78981551bead86dc6.jpeg)
字符串连接的另一个方法 format! 宏.
使用format!宏也可以实现连接2个字符串.
用法如下:
fn demo33() { let n1 = "Hello ".to_string(); let n2 = "Rust ".to_string(); let n3 = format!("{} {}", n1, n2); println!("{}", n3);}fn main() { demo33();}
cargo run:
![5c55d3621404d628707ebd67c1c648de.png](https://i-blog.csdnimg.cn/blog_migrate/b47f22db02c84579ae959b4c9f21004a.jpeg)
标准库字符串内置了很多方法. 可参考:
https://doc.rust-lang.org/std/string/struct.String.html
今天太晚了,就到这里!欢迎大家一起交流!
![29f4e743a43fb6c1b24cf38fc2cc57e1.png](https://i-blog.csdnimg.cn/blog_migrate/5783265f330ad172a96453a8d15718f9.jpeg)