rust中的str, String, 分的比较清.
简单的可以理解为: str 是分配在栈上, String分配在堆上.
0x01 String str 初始化
let mut a = String::from("food"); // 在堆上分配内存
println!("{:p}", a.as_ptr()); // 打印堆内存的地址
println!("{:p}", &a); // 打印变量a 在栈上的地址
println!("{}", a.len()); // 字符串在堆内存中的字节长度, 不是 字符长度!!!
a.reserve(10); // 增加堆的内存长度
println!("{}", a.capacity()); // 总字节容量
let str: String = String::new(); // 创建空对象
let str2: String = String::from("hello rust"); // 创建堆内存
let str3: String = String::with_capacity(20); // 创建20字节的空堆内存
let str4: &'static str = "the tao of rust"; // 静态变量
let str5: String = str4.chars().filter(|c| !c.is_whitespace()).collect(); // .chars() 返回 各字符
let str6: String = str4.to_owned(); // 与 to_string() 基本相同
let str7: String = str4.to_string();
let str: &str = &str4[11..15]; // 取静态字符串的部分内容, 学名 切片 (slice)
0x02 字符串操作
- 字符串增加
let mut hello = String::from("Hello, ");
hello.push('R');
hello.push_str("Gorey");
hello.insert_str(2, "-");
println!("{}", hello);
let left = "the tao".to_string();
let mut right = "Rust".to_string();
let sum = left + &right;
println!("{}", sum);
right += "Hahaha";
println!("{}", right);
- 字符串遍历
let s = String::from("good morning");
let s: String = s.chars().enumerate().map(|(i, c)| {
if i % 2 == 0 {
c.to_lowercase().to_string()
} else {
c.to_uppercase().to_string()
}
}).collect();
println!("{}", s);
- 字符串位置查询,及字串
let mut s = String::from("Hello Gorey");
s.remove(4);
println!("{}", s);
let m = s.pop().unwrap();
println!("{}", m);
println!("{}", s);
s.truncate(4);
println!("{}", s);
s.clear();
println!("{}", s);
let mut s = String::from("Hello Gorey");
let bo = s.find("Gorey").unwrap_or(s.len());
println!("index of :[{}]", bo);
let t :String = s.drain(..bo).collect();
println!("drain rst :[{}]", t);
w```
输出结果:
Hell Gorey
y
Hell Gore
Hell
index of :[6]
drain rst :[Hello ]
网友评论