String

String 是标准堆分配的可扩容 UTF-8 字符串缓冲区:

fn main() {
    let mut s1 = String::new();
    s1.push_str("Hello");
    println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity());

    let mut s2 = String::with_capacity(s1.len() + 1);
    s2.push_str(&s1);
    s2.push('!');
    println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity());

    let s3 = String::from("🇨🇭");
    println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count());
}

String 会实现 Deref<Target = str>,这意味着您可以 对 String 调用所有 str 方法。

This slide should take about 10 minutes.
  • “String::new”会返回一个新的空字符串,如果您知道自己想要推送到字符串的数据量,请使用“String::with_capacity”。
  • “String::len”会返回“String”的大小(以字节为单位,可能不同于以字符为单位的长度)。
  • “String::chars”会针对实际字符返回一个迭代器。请注意,由于字素簇,“char”可能与人们所认为的“字符”有所不同。
  • 当人们提到字符串时,可能是指“&str”或“String”。
  • 当某个类型实现“Deref<Target = T>”时,编译器会让您以公开透明方式从“T”调用方法。
    • 我们尚未讨论过 Deref trait,所以本部分目前主要介绍文档中边栏的结构。
    • “String”会实现“Deref<Target = str>”,后者可公开透明地授予其访问“str”方法的权限。
    • Write and compare let s3 = s1.deref(); and let s3 = &*s1;.
  • “String”是作为字节矢量的封装容器实现的,矢量上支持的许多操作在“String”上也受支持,但有一些额外保证。
  • 比较将“String”编入索引的不同方式:
    • 使用“s3.chars().nth(i).unwrap()”转换为字符,其中“i”代表是否出界。
    • 通过使用“s3[0..4]”转换为子字符串,其中该 Slice 在或不在字符边界上。
  • Many types can be converted to a string with the to_string method. This trait is automatically implemented for all types that implement Display, so anything that can be formatted can also be converted to a string.