String
vs 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
类型是一个 bytes 类型 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 优化)。