推荐答案
在 Rust 中,字符串类型主要有两种:String
和 &str
。
String
类型
String
是一个可变的、拥有所有权的字符串类型,存储在堆上。它支持动态增长和修改。
let mut s = String::from("hello"); s.push_str(", world!"); // 追加字符串 println!("{}", s); // 输出: hello, world!
&str
类型
&str
是一个不可变的字符串切片,通常是对 String
或字符串字面量的引用。
let s = String::from("hello"); let slice: &str = &s[0..2]; // 获取字符串切片 println!("{}", slice); // 输出: he
字符串字面量
字符串字面量是 &str
类型,存储在程序的只读内存中。
let s: &str = "hello"; println!("{}", s); // 输出: hello
字符串的常用操作
- 拼接字符串:使用
+
或format!
宏。 - 遍历字符:使用
chars()
方法。 - 字符串长度:使用
len()
方法。
-- -------------------- ---- ------- --- -- - ---------------------- --- -- - -------------- -------- --- -- - -- - ---- -- ----- -------------- ---- -- --- ----- ----- --- - -- ---------- - -------------- --- -- ------ - ----------------- ---- ---------- -- -------
本题详细解读
String
和 &str
的区别
- 所有权:
String
拥有字符串的所有权,而&str
只是一个引用。 - 可变性:
String
是可变的,而&str
是不可变的。 - 存储位置:
String
存储在堆上,&str
可以是对堆上数据的引用,也可以是对字符串字面量的引用。
字符串的创建与转换
- 创建
String
:可以使用String::from()
或to_string()
方法。 - 从
String
获取&str
:可以通过引用或切片操作。
let s1 = String::from("hello"); let s2 = "world".to_string(); let s3: &str = &s1;
字符串的常用方法
push_str
:追加字符串。push
:追加单个字符。replace
:替换子字符串。trim
:去除前后空白字符。
let mut s = String::from("hello"); s.push_str(" world"); s.push('!'); let s = s.replace("world", "Rust"); let s = s.trim();
字符串的索引与切片
Rust 不允许直接通过索引访问字符串中的字符,因为字符串是 UTF-8 编码的,字符可能占用多个字节。可以通过 chars()
方法遍历字符,或使用切片操作获取子字符串。
let s = String::from("hello"); let slice = &s[0..2]; // 获取前两个字节 println!("{}", slice); // 输出: he
字符串的性能考虑
由于 String
是可变的,频繁的字符串操作可能会导致内存重新分配。为了避免这种情况,可以使用 String::with_capacity()
预分配内存。
let mut s = String::with_capacity(10); s.push_str("hello"); println!("{}", s.capacity()); // 输出: 10
字符串的错误处理
在处理字符串时,可能会遇到无效的 UTF-8 数据。Rust 提供了 from_utf8()
和 from_utf8_lossy()
方法来处理这种情况。
let bytes = vec![104, 101, 108, 108, 111]; let s = String::from_utf8(bytes).unwrap(); println!("{}", s); // 输出: hello
通过理解 String
和 &str
的区别及其常用操作,可以更好地在 Rust 中处理字符串数据。