Rust的`String`和`str`有什么区别?

984
为什么Rust同时拥有Stringstr?它们之间有什么区别,何时应该使用其中之一而不是另一个?它们中的一个是否会被弃用?
15个回答

7

String 是一个对象。

&str 是对象的一部分指针。

enter image description here


当人们说"&str就像是数据的视图(切片)"时,有时候会听起来很困惑;这个图形非常清楚地展示了它。唯一这个答案没有真正帮助到的是,String是可拥有和可变的,而&str是不可变且非拥有的。 - dvub

6

对于C#和Java开发者:

  • Rust的String === StringBuilder
  • Rust的&str ===(不可变的)字符串

我喜欢把&str看作是字符串的一个视图,就像Java / C#中的interned string一样,您不能更改它,只能创建一个新的。


3
Java/C# 字符串和 Rust 字符串最大的区别在于 Rust 保证字符串是正确的 Unicode 格式,因此获取字符串中的第三个字符需要比简单地使用 "abc"[2] 更多的思考。(鉴于我们生活在一个多语言的世界中,这是一件好事情。) - Squirrel
3
这是不正确的。可变性的主题已经在得票最高的答案中进行了讨论,请阅读它以了解更多信息。 - Shepmaster
2
&mut str 相对较少见,与 &str 不同。 - Squirrel

5
在Rust中,str是一种基本类型,代表Unicode标量值序列,也称为字符串片。这意味着它是一个对字符串的只读视图,并且它不拥有指向的内存。另一方面,String是一种可增长、可变的拥有字符串类型。这意味着当你创建一个String时,它将在堆上分配内存来存储字符串内容,并在String超出范围时释放该内存。因为String是可增长和可变的,所以在创建后可以更改String的内容。
通常,在想要引用存储在其他数据结构中的字符串片(如String)时使用str。而在想要创建和拥有字符串值时使用String。

-1

字符串:

  • 字符串是一种动态的、堆分配的、可增长的字符序列。
  • 用于存储和操作可以变化大小的文本数据。
  • 表示拥有的字符串数据。

示例:

let s: String = String::from("Hello");
println!("{}", s); 
// Output: Hello

   

&str(字符串片段):

  • &str是指向存储在内存中的一系列字符(片段)的不可变引用。
  • 用于处理字符串数据而不取得所有权。
  • 可以与字符串字面值一起使用,也可以从String借用。

示例:

fn print_length(s: &str) {
    println!("Length: {}", s.len());
}

let greeting = "Hello";
print_length(greeting); 
// Output: Length: 5

请记住,String和&str是相关的,但它们在Rust中有不同的用途和所有权特性。


-10

这里有一个快速简单的解释。

String - 一种可增长、可拥有的堆分配数据结构。它可以被强制转换为 &str

str - 是(现在,随着 Rust 的发展)可变的、固定长度的字符串,它存在于堆或二进制中。你只能通过字符串切片视图,如 &str,以借用类型的方式与 str 进行交互。

使用注意事项:

如果您想拥有或改变一个字符串,比如将字符串传递给另一个线程等,请优先选择 String

如果您想要一个字符串的只读视图,请优先选择 &str


3
这是错误的。可变性的主题已经在得票最高的回答中讨论过了,请阅读它以了解更多信息。 - Shepmaster
@ShepmasterпјҢдҪ еңЁжүҖжңүеӣһеӨҚдёӯж··ж·ҶдәҶ&strе’Ң&mut strгҖӮиҝҷжҳҜдёӨдёӘдёҚеҗҢзҡ„дёңиҘҝгҖӮ - Tanveer Badar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接