“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))。