Appearance
1. String、&String、str、&str
从本质上来说,Rust中只有一种字符串,就是str,而String只不过是基于str的一个结构体。具体关系参考下图:

str可以认为是分配在堆上的数据,本质上是是一个Vec<u8>&str是对str的一个引用,是字符串切片。本质上是一个胖指针,除了引用地址外,额外多了一个属性表示字符串长度String是一个结构体,包含三部分:指针、长度、容量&String是对String的一个引用,是一个普通指针
此外,值得了解的是:
- 字符串字面量的类型为
&str,且具有'static的生命周期,即&'static str - 通常我们使用的是
String、&String或&str,一般不会直接使用str
2. 转换
String和&str之间的相互转换,参考如下示例:
rust
fn main() {
let s1 = "hello world"; // &str
println!("{}", s1.len());
let s2 = s1.to_string(); // &str -> String
println!("{}", s2.len());
println!("{}", s2.capacity());
let s3 = String::from("hello world"); // String
println!("{}", s2.len());
println!("{}", s2.capacity());
let s4 = s3.as_str(); // String -> &str
println!("{}", s4.len());
let s5 = &s3[6..]; // String -> &str
println!("{}", s5);
}