推荐答案
在 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()方法。
// www.javascriptcn.com code example
let s1 = String::from("hello");
let s2 = String::from(" world");
let s3 = s1 + &s2; // 拼接字符串
println!("{}", s3); // 输出: hello world
for c in s3.chars() {
println!("{}", c); // 逐个字符输出
}
println!("Length: {}", s3.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 中处理字符串数据。