• 字符串 String

    字符串 String

    Rust 中有两种字符串类型:String&str

    String 被存储为一个字节形式(Vec<u3>)的vector ,但确保一定是一个有效的 UTF-8 序列。String 是堆分配的,可增大且无上限。

    &str 是一个指向有效 UTF-8 序列的切片(&[u8]),并可在用来查看 String 的内容,就如同 &[T]Vec<T> 的全部或部分引用。(原文:&str is a slice (&[u8]) that always points to a valid UTF-8 sequence, and can be used to view into a String, just like &[T] is a view into Vec<T>.)(您是否有更好的翻译?请改进此句翻译,感谢!)

    1. fn main() {
    2. // (所有的类型标注都是都是多余)
    3. // 一个指向在只读内存中堆分配字符串的引用
    4. let pangram: &'static str = "the quick brown fox jumps over the lazy dog";
    5. println!("Pangram: {}", pangram);
    6. // 逆序迭代单词,不用分配新的字符串
    7. // (原文:Iterate over words in reverse, no new string is allocated)
    8. println!("Words in reverse");
    9. for word in pangram.split_whitespace().rev() {
    10. println!("> {}", word);
    11. }
    12. // 复制字符到一个 vector,排序并移除重复值
    13. let mut chars: Vec<char> = pangram.chars().collect();
    14. chars.sort();
    15. chars.dedup();
    16. // 创建一个空的且可增长的 `String`
    17. let mut string = String::new();
    18. for c in chars {
    19. // 在字符串的尾部插入一个字符
    20. string.push(c);
    21. // 在字符串尾部插入一个字符串
    22. string.push_str(", ");
    23. }
    24. // 此切割的字符串是原字符串的一个切片,所以没有执行新分配操作
    25. let chars_to_trim: &[char] = &[' ', ','];
    26. let trimmed_str: &str = string.trim_matches(chars_to_trim);
    27. println!("Used characters: {}", trimmed_str);
    28. // 堆分配一个字符串
    29. let alice = String::from("I like dogs");
    30. // 分配新内存并存储修改过的字符串
    31. let bob: String = alice.replace("dog", "cat");
    32. println!("Alice says: {}", alice);
    33. println!("Bob says: {}", bob);
    34. }

    更多 str/String 方法可以在 std::str 和 std::string 模块中找到。