007 Rust字符串
Rust字符串有两种类型:String和 &str。
- String :字符串,可以对字符串进行修改、追加等操作。
- &str : 字符串切片,是一种引用类型,是无法修改字符串的内容。
String
可增长的、可变的、在堆上分配的字符串类型。当你需要拥有并修改字符串数据时使用。
let mut s = String::from("Hello");
s.push_str(", world!"); // 修改字符串
println!("{}", s); // 输出: Hello, world!
String字符串常见操作
1、创建 String
// 从字符串字面量创建
let s1 = String::from("Hello");
let s2 = "Hello".to_string(); // 同上,两种方式等价// 新建空字符串然后推送数据
let mut s3 = String::new();
s3.push_str("Hello");
s3.push('!'); // 推送单个字符
2、字符串拼接
有多种方式可以拼接字符串:
(1)使用 +
运算符或 format!
宏(推荐 format!
用于复杂拼接):
// 使用 + 拼接
let s1 = String::from("Hello");
let s2 = String::from("world");
let s3 = s1 + " " + &s2; // 注意:s1 的所有权被移动,后续不能再使用 s1// 使用 format!,不会获取任何变量的所有权
let s1 = String::from("Hello");
let s2 = String::from("world");
let s3 = format!("{} {}!", s1, s2); // s1 和 s2 仍然可用
(2)使用 push_str
方法:
let mut s = String::from("Hello");
s.push_str(" world");
注意: Rust 的字符串不支持直接通过索引(如 s[0])访问字符。这是因为字符串是 UTF-8 编码的,一个字符可能由多个字节组成,直接索引无法保证总是返回一个有效的 Unicode 标量值。
替代方案是使用迭代:
let s = "Здравствуйте";// 遍历字符,.chars()方法:该方法返回一个迭代器,可以遍历字符串的Unicode字符。
for c in s.chars() {println!("{}", c);
}// 遍历字节,.bytes()方法:该方法返回一个迭代器,可以遍历字符串的字节序列。
for b in s.bytes() {println!("{}", b);
}// 获取第 n 个字符(效率较低,因为需要从头遍历)
if let Some(c) = s.chars().nth(2) {println!("第三个字符是: {}", c);
}
&str(字符串切片)
&str是一个不可变的引用,指向某个字符串的片段(可以是 String的切片,也可以是字符串字面量)。
let s = String::from("Hello, world!");
let hello = &s[0..5]; // hello 是一个 &str,指向 s 的一部分
let world = &s[7..12];// 字符串字面量也是 &str
let literal: &str = "Hello";
使用切片语法需要小心,必须保证切片的边界是字符的边界(UTF-8 编码边界),否则程序会在运行时 panic。
字符串字面量
字符串字面量(如 “Hello”)的类型是 &'static str。它是一个指向程序二进制文件中预分配文本的切片,因此在程序的整个生命周期内都有效。
提示:
- 在函数中接收字符串参数时,通常使用 &str以获得最大的灵活性(既可以传递 String,也可以传递字符串字面量)。
- 当你需要拥有字符串数据或需要修改它时,使用 String。
- 处理用户输入或需要构建字符串时,使用 String。
- 记住字符串是 UTF-8 编码的,直接索引访问不被允许,需要使用 chars()或 bytes()方法进行迭代。