在編寫程序時(shí),處理文本數(shù)據(jù)是一個(gè)常見的需求。在 Rust 中,處理字符串有兩種主要方式:String 和 &str(稱為字符串切片,或簡稱為“引用字符串”)。本文將詳細(xì)講解它們的主要區(qū)別以及在不同場景下如何選擇合適的類型。
String
String
是 Rust 中一種擁有所有權(quán)的字符串類型,它是堆分配的。這意味著字符串的數(shù)據(jù)存儲(chǔ)在堆上,而在棧上存儲(chǔ)的是一個(gè)“胖指針”(fat pointer)。這個(gè)胖指針包含以下信息:
- 指針:指向堆上存儲(chǔ)字符串?dāng)?shù)據(jù)的內(nèi)存地址。
- 長度:當(dāng)前字符串的字節(jié)長度。
創(chuàng)建不可變的 String
可以通過以下方式創(chuàng)建一個(gè) String
:
let my_string = String::from(\"Hello, World\");
或者:
let my_string: String = \"Hello, World\".into();
&String:對(duì) String 的不可變引用
&String
是對(duì) String
的不可變引用。它允許在程序的其他部分使用 String
的數(shù)據(jù),而無需在內(nèi)存中復(fù)制字符串。需要注意的是,&String
是不可變的,無法修改堆上的字符串?dāng)?shù)據(jù)。
&String
的結(jié)構(gòu)如下:
- 棧上存儲(chǔ)一個(gè)指針,該指針指向
String
的胖指針。
&mut String:對(duì) String 的可變引用
&mut String
是對(duì) String
的可變引用。它允許修改堆上的字符串?dāng)?shù)據(jù)。使用可變引用時(shí),新值會(huì)覆蓋原有的字符串內(nèi)容。
&mut String
的結(jié)構(gòu)如下:
- 棧上存儲(chǔ)一個(gè)指針,該指針指向
String
的胖指針。
mut String:可變的 String
mut String
是一種可變的 String
類型。它和普通的 String
一樣,數(shù)據(jù)存儲(chǔ)在堆上,但允許修改堆上的數(shù)據(jù)。
創(chuàng)建可變字符串的方式如下:
let mut my_string = String::from(\"Hello, World\");
或者:
let mut my_string: String = \"Hello, World\".into();
&str
&str
是一種字符串切片類型,它是對(duì)字符串?dāng)?shù)據(jù)的引用,且始終是不可變的。&str
可以引用以下三種數(shù)據(jù)來源:
引用一個(gè) String
在這種情況下,&str
是由一個(gè)胖指針(包含指針和字符串的字節(jié)長度)組成,直接指向堆上的 String
數(shù)據(jù)。例如:
let my_string = String::from(\"Hello, World\");
let my_ref_stir: &str = &my_string;
引用只讀內(nèi)存中的字符串字面量
在這種情況下,&str
的胖指針指向存儲(chǔ)在只讀內(nèi)存中的字符串?dāng)?shù)據(jù)。例如:
let my_ref_stir = \"Hello, World\";
引用一個(gè)現(xiàn)有字符串的一部分(切片)
在這種情況下,&str
的胖指針指向堆上 String
數(shù)據(jù)的一部分。例如:
let my_string = \"Hello, world!\";
let my_ref_stir: &str = &my_string[0..5];
使用建議
以下是選擇 String
和 &str
的一些經(jīng)驗(yàn)法則:
- 需要一個(gè)簡單的字符串時(shí):使用
String
。 - 需要對(duì)字符串的不可變引用時(shí):使用
&str
,因?yàn)樗咝А?/section> - 需要一個(gè)可變字符串時(shí):優(yōu)先選擇
mut String
,而不是對(duì)現(xiàn)有字符串的可變引用(&mut String
),因?yàn)榍罢咝阅芨鼉?yōu)。
總結(jié)
Rust 提供了兩種主要的字符串類型:String
和 &str
。String
是擁有所有權(quán)的堆分配字符串,適用于需要?jiǎng)討B(tài)分配和修改字符串的場景;而 &str
是對(duì)字符串?dāng)?shù)據(jù)的不可變引用,適用于只需要讀取字符串的場景。通過理解它們的區(qū)別和使用場景,可以更高效地管理 Rust 程序中的字符串?dāng)?shù)據(jù)。
示例代碼
以下是本文中提到的代碼片段,供參考:
// 創(chuàng)建一個(gè)不可變的 String
let my_string = String::from(\"Hello, World\");
// 創(chuàng)建一個(gè)可變的 String
let mut my_string = String::from(\"Hello, World\");
// 對(duì) String 的不可變引用
let my_ref_stir: &str = &my_string;
// 對(duì) String 的部分切片
let my_slice: &str = &my_string[0..5];
通過合理選擇 String
和 &str
,可以在 Rust 中實(shí)現(xiàn)高效的字符串操作。
閱讀原文:原文鏈接
該文章在 2025/1/24 9:41:59 編輯過