“String”与“str”的区别
现在我们就可以理解 Rust 中的两种字符串类型:
fn main() { let s1: &str = "World"; println!("s1: {s1}"); let mut s2: String = String::from("Hello "); println!("s2: {s2}"); s2.push_str(s1); println!("s2: {s2}"); let s3: &str = &s2[6..]; println!("s3: {s3}"); }
Rust 术语:
&str是一个指向字符串片段的不可变引用。String是一个可变字符串缓冲区。
-
&str引入了一个字符串切片,它是一个指向保存在内存块中的 UTF-8 编码字符串数据的不可变引用。 字符串字面量(”Hello”)会保存在程序的二进制文件中。 -
Rust 的
String类型是一个字节 vector 的封装。和Vec<T>一样,它是拥有所有权的。 -
和其他类型一样,
String::from()会从字符串字面量创建一个字符串;String::new()会创建一个新的空字符串, 之后可以使用push()和push_str()方法向其中添加字符串数据。 -
format!()宏可以方便地动态生成拥有所有权的字符串。它接受和println!()相同的格式规范。 -
你可以通过
&和可选的范围选择从String中借用&str切片。 -
对于 C++ 程序员:可以把
&str当作 C++ 中的const char*,但是它总是指向内存中的一个有效字符串。 Rust 的String大致相当于 C++ 中std::string(主要区别:它只能包含 UTF-8 编码的字节, 并且永远不会使用小字符串优化(small-string optimization))。