Skip to content

Rust中的字符串

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);
}

参考