乐闻世界logo
搜索文章和话题

What are the differences between Rust's ` String ` and ` str `?

1 个月前提问
1 个月前修改
浏览次数16

1个答案

1

Stringstr是Rust语言中处理字符串的两种主要数据类型,它们有一些关键的区别和各自的使用场景:

  1. 数据存储方式:

    • String是一个可增长的、堆分配的、UTF-8编码的字符串类型。它可以被修改,可以增加内容或者改变里面的内容。
    • str通常以&str的形式存在,这是一个字符串切片(string slice),它是对某个String的引用,或者对程序内存中的其他字符串数据的引用。str本身存储在静态内存中,是不可变的。
  2. 所有权和借用:

    • String拥有它包含的数据,当String离开其作用域时,其数据会被自动清理。
    • &str则没有所有权,它只是借用了存储字符串数据的实际所有者(比如一个String或者其他&str)的数据。
  3. 性能考虑:

    • 修改String可能涉及内存的重新分配,特别是当添加的数据超过了当前分配的内存容量时。
    • 使用&str则不会有这样的性能影响,因为它仅是一个指向已存在数据的引用。
  4. 使用场景:

    • 当你需要一个可以修改的字符串时,使用String。例如,当你从文件中读取文本并希望修改文字内容或者动态地添加文字时。
    • 当你需要高效地处理和传递字符串数据,而不需要修改它时,使用&str。这在函数参数传递中特别常见,因为使用&str可以避免数据的复制,从而提高效率。

例子:

rust
fn main() { let mut s = String::from("hello"); // 创建一个String s.push_str(", world"); // 修改String print_with_prefix(&s); // 传递一个对String的引用 let fixed_str = "fixed string"; // 固定字符串,类型是&'static str print_with_prefix(fixed_str); // 直接传递str切片 } fn print_with_prefix(text: &str) { // 使用&str作为参数,提高函数的通用性和效率 println!("prefix: {}", text); }

在这个例子中,s是一个String,我们对它进行修改和增加内容。而print_with_prefix函数接受一个&str参数,展示了如何用&str来提高代码的灵活性和效率。

2024年8月7日 16:53 回复

你的答案