Rust 学习笔记, Rust 教程
往期回顾:
Rust学习笔记-1 Rust 介绍.
Rust 学习笔记-2 环境安装
Rust学习笔记-2.1 rustup 镜像加速,飞起
Rust 学习笔记-3 Hello World
Rust学习笔记-4 Rust 基础数据类型
Rust 学习笔记-5 变量与常量
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
字符串常用方法
new()
例如:
fn demo22() { let mut z = String::new(); z.push_str("hello"); println!("{}", z);}
cargo run:
to_string()
栗子:
fn demo23() { let name1 = "Hello World Hello!".to_string(); println!("{}", name1);}fn main() { demo23();}
cargo run:
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:
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:
push()
将给定的字符追加到字符串的末尾
栗子:
fn demo26() { let mut company = "Tutorial".to_string(); company.push('s'); println!("{}", company);}fn main() { demo26();}
cargo run:
len()
len()返回字符总数包括空格.
fn demo27() { let fullname = " Tutorials"; println!("length is {}", fullname.len());}fn main() { demo27();}
cargo run:
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:
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
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:
用 "+" 运算符 连接字符串
字符串可以通过+ 连接起来. 其实就是把后一个加到前一个里面去.
fn demo31() { let n1 = "Hello ".to_string(); let n2 = "Rust".to_string(); let n3 = n1 + &n2; // n2 是引用. println!("{}", n3);}fn main() { demo31();}
cargo run:
类型转换
比如将整数转成字符串.
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:
字符串连接的另一个方法 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:
标准库字符串内置了很多方法. 可参考:
https://doc.rust-lang.org/std/string/struct.String.html
今天太晚了,就到这里!欢迎大家一起交流!