Rust 中的字符串:String 还是 &str?

开发 前端
Rust 提供了两种主要的字符串类型:String​ 和 &str。String​ 是拥有所有权的堆分配字符串,适用于需要动态分配和修改字符串的场景;而 &str 是对字符串数据的不可变引用,适用于只需要读取字符串的场景。

在编写程序时,处理文本数据是一个常见的需求。在 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 的一些经验法则:

  • 需要一个简单的字符串时:使用 String。
  • 需要对字符串的不可变引用时:使用 &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 中实现高效的字符串操作。

责任编辑:武晓燕 来源: Rust开发笔记
相关推荐

2021-11-07 07:51:01

JavaString字符串

2009-11-26 17:16:38

PHP函数str_re

2024-06-11 07:34:58

C#字符串性能

2021-04-15 00:16:18

JavaString字符串

2010-06-28 15:18:51

SQL Server

2013-12-12 17:08:24

Lua字符串

2024-04-12 12:14:39

Rust字符串代码

2024-03-06 08:41:14

Python字符串格式化工具

2010-09-06 17:30:46

SQL函数

2021-03-11 18:44:39

字符串SQL表达式

2021-09-10 08:18:31

Go语言字符串

2011-07-11 16:00:22

字符串拼接

2011-06-08 15:45:41

字符串JAVA

2020-09-03 10:13:49

JavaScript字符串pad

2021-09-07 09:23:07

C++字符串算法

2009-02-24 15:39:27

字符串比较函数函数

2024-03-05 18:29:54

JavaString字符串

2021-05-27 08:59:09

String字符串操作

2010-09-09 11:48:00

SQL函数字符串

2015-06-09 14:43:36

javascript操作字符串
点赞
收藏

51CTO技术栈公众号