rust字符和字符串操作
详细看下面代码:注意第六十行有错误。
fn main() {
// 定义字符 char
let c1: char = 'a';
let mut c2: char = '中';
let c3: char = '😀';
println!("字符: c1={}, c2={}, c3={}", c1, c2, c3);
c2 = '间';
println!("字符: c1={}, c2={}, c3={}", c1, c2, c3);
let s2: char = '\''; // 转义单引号
println!("转义单引号: {}", s2);
// 声明元组
let tup: (i32, f64, u8) = (500, 6.4, 1);
let tup2 = ("hello", 3.14, 'A');
// 打印全部元组元素
println!("元组2: {:?}", tup);
// 解构元组
let (x, y, z) = tup;
println!("解构: x={}, y={}, z={}", x, y, z);
// 通过索引访问元组元素
println!(
"索引访问: tup2.0={}, tup2.1={}, tup2.2={}",
tup2.0, tup2.1, tup2.2
);
// 定义字符串 &str
let s1: &str = "hello"; // 字符串字面量 这里是双引号,双引号,只要多个字符串都用双引号包裹
println!("字符串: {}, 转义字符: {}", s1, s2);
// &str:字符串切片,指向 UTF-8 字节序列的引用
let s1: &str = "hello"; // 字符串字面量,存储在二进制常量中,这里是指针 + 空间只读
println!("字符串长度: {}", s1.len());
// String:堆分配的 UTF-8 字符串,可变
let s2: String = String::from("world"); // 这里定义个对象,这里是指针 + 空间只读
println!("s2: {}", s2);
let mut s3: String = String::from("world"); // 这里定义个对象,这里是指针 + 空间可变
s3.push_str("!");
println!("s3: {}", s3);
let s3: String = String::new(); // 这里是一个字符串对象,但没有值,无意义。
println!("s3: {}", s3);
let mut s4: String = String::new(); // 这里是一个字符串对象,但没有值,但可变,可以添加字符串
s4.push_str("add hello");
s4.push(' '); // 增加 char 空格
println!("s4: {}", s4);
let s4: String = "world".to_string(); // 和 let s2: String = String::from("world"); 一样
println!("s4: {}", s4);
// 字符串拼接, 注意指针移动,s1 被移动,不能再使用,s2 没有被移动,可以继续使用
let s1: String = "Hello".to_string();
let mut s2: String = "world".to_string();
let s5: String = s1 + " " + &s2; // s1 被移动
println!("拼接结果: {}", s5);
println!("可用 s2: {}", s2); // s2 未被移动,可以继续使用
s2 = "rust".to_string();
println!("s2 新值: {}", s2);
println!("s2变化后的s5: {}", s5);
println!("不可用 s1: {}", s1); // s1 被移动,不能再使用 错误,
// format! 宏
let s6 = format!("{} {} {}", "a", "b", "c");
println!("format! 宏: {}", s6);
// 字符串索引(需要小心 UTF-8 编码)
let s7 = "你好";
println!("字符串长度(字节): {}", s7.len()); // 6 字节
// let c = s7[0]; // 编译错误:不能直接索引字符串
}