Rust 中的字符串:String 还是 &str?
|
admin
2025年1月23日 22:1
本文热度 334
|
在编写程序时,处理文本数据是一个常见的需求。在 Rust 中,处理字符串有两种主要方式:String 和 &str(称为字符串切片,或简称为“引用字符串”)。本文将详细讲解它们的主要区别以及在不同场景下如何选择合适的类型。
String
String
是 Rust 中一种拥有所有权的字符串类型,它是堆分配的。这意味着字符串的数据存储在堆上,而在栈上存储的是一个“胖指针”(fat pointer)。这个胖指针包含以下信息:
创建不可变的 String
可以通过以下方式创建一个 String
:
let my_string = String::from(\"Hello, World\");
或者:
let my_string: String = \"Hello, World\".into();
&String:对 String 的不可变引用
&String
是对 String
的不可变引用。它允许在程序的其他部分使用 String
的数据,而无需在内存中复制字符串。需要注意的是,&String
是不可变的,无法修改堆上的字符串数据。
&String
的结构如下:
- 栈上存储一个指针,该指针指向
String
的胖指针。
&mut String:对 String 的可变引用
&mut String
是对 String
的可变引用。它允许修改堆上的字符串数据。使用可变引用时,新值会覆盖原有的字符串内容。
&mut String
的结构如下:
- 栈上存储一个指针,该指针指向
String
的胖指针。
mut String:可变的 String
mut String
是一种可变的 String
类型。它和普通的 String
一样,数据存储在堆上,但允许修改堆上的数据。
创建可变字符串的方式如下:
let mut my_string = String::from(\"Hello, World\");
或者:
let mut my_string: String = \"Hello, World\".into();
&str
&str
是一种字符串切片类型,它是对字符串数据的引用,且始终是不可变的。&str
可以引用以下三种数据来源:
引用一个 String
在这种情况下,&str
是由一个胖指针(包含指针和字符串的字节长度)组成,直接指向堆上的 String
数据。例如:
let my_string = String::from(\"Hello, World\");
let my_ref_stir: &str = &my_string;
引用只读内存中的字符串字面量
在这种情况下,&str
的胖指针指向存储在只读内存中的字符串数据。例如:
let my_ref_stir = \"Hello, World\";
引用一个现有字符串的一部分(切片)
在这种情况下,&str
的胖指针指向堆上 String
数据的一部分。例如:
let my_string = \"Hello, world!\";
let my_ref_stir: &str = &my_string[0..5];
使用建议
以下是选择 String
和 &str
的一些经验法则:
- 需要对字符串的不可变引用时:使用
&str
,因为它更高效。 - 需要一个可变字符串时:优先选择
mut String
,而不是对现有字符串的可变引用(&mut String
),因为前者性能更优。
总结
Rust 提供了两种主要的字符串类型:String
和 &str
。String
是拥有所有权的堆分配字符串,适用于需要动态分配和修改字符串的场景;而 &str
是对字符串数据的不可变引用,适用于只需要读取字符串的场景。通过理解它们的区别和使用场景,可以更高效地管理 Rust 程序中的字符串数据。
示例代码
以下是本文中提到的代码片段,供参考:
// 创建一个不可变的 String
let my_string = String::from(\"Hello, World\");
// 创建一个可变的 String
let mut my_string = String::from(\"Hello, World\");
// 对 String 的不可变引用
let my_ref_stir: &str = &my_string;
// 对 String 的部分切片
let my_slice: &str = &my_string[0..5];
通过合理选择 String
和 &str
,可以在 Rust 中实现高效的字符串操作。
阅读原文:原文链接
该文章在 2025/1/24 9:41:59 编辑过