此小節針對四種文字型別做說明,而對於字串切片則是在日後有專門的章節說明,此處仍是作為必要知道的基礎。
String
String 表示一個可增長、可變的、UTF-8 編碼的字串。
它是一個「動態」型別,這意味著它的大小可以在執行時改變。
String 將其資料儲存在堆積上 。這意味著程式會從堆積請求記憶體來儲存字串,使其能夠根據需要增長或縮小。
當你擁有一個 String 時,你就擁有已分配的堆積記憶體。當 String 離開作用域時,記憶體會自動釋放。
範例:let mut my_string = String::from("hello");
&String
&String 是一個指向 String 的引用。
引用允許你「借用」資料而不取得所有權。
&String 是一個指向已經存在於其他地方(堆積上)的 String 的指標。引用本身儲存在堆疊上 。
使用 &String 可以避免不必要的複製和所有權轉移。
範例:let my_string_ref = &my_string;
(其中 my_string 是一個 String)
str (字串切片)
str(通常稱為「字串切片」)是一個對字串的唯讀檢視。
它表示某個較大字串中的 UTF-8 位元組序列。
str 本身在大多數情況下不能直接用作變數型別。這是因為它的大小在編譯時是未知的。你幾乎總是會看到它在指標後面使用,字串字面值(例如,"hello")是 str 字面值。文字直接嵌入到程式的二進位檔案中。
&str
&str 是一個指向 str 的引用。這是你使用字串切片最常見的方式。
它是一個指向字串資料的指標。此資料可能是:
let my_str_ref: &str = "hello";
型別 | 儲存位置 | 可否變更 | 所有權 | 範例 |
---|---|---|---|---|
String | 堆積(Heap) | ✅ 可變 | 擁有者 | String::from() |
&String | 堆積 | ❌ 只讀 | 借用者 | &String |
str | 常數(二進位) | ❌ 不可變 | 靜態 | "hello" 字面值 |
&str | 指向常數區段 | ❌ 只讀 | 借用者 | let s: &str = "hi" |
📚 參考文件:
以下程式碼展示了 Rust 中 Copy
trait 在字串切片與參照(reference)上的應用方式,並說明為何 &str
能被複製、使用者可以安全地使用多個變數來參照同一段資料。
fn main() {
let ice_cream = "Cookies and Cream";
let dessert = ice_cream;
println!("{}{}", ice_cream, dessert);
}
"Cookies and Cream"
是 Rust 的 字串切片(&str
),會編譯進程式的唯讀記憶體區段(binary memory)。ice_cream
是 &str
,屬於一種參照型別(reference type)。let dessert = ice_cream;
時,這不是 Move,而是 Copy 行為,因為 &str
實作了 Copy
trait。ice_cream
和 dessert
都指向同一段資料,但彼此是獨立的參照。條件項目 | 說明 |
---|---|
型別是否 Copy? | ✅ &str 是 Copy 的 |
是否移動所有權? | ❌ 否,只是複製參照結構 |
儲存位置 | 常數字串在 binary 中,參照資訊存在 stack 上 |
安全嗎? | ✅ 編譯器保證參照不會比原始資料活得更久(lifetime) |
&str
是一種實作了 Copy
trait 的參照型別,讓我們可以將它安全地賦值給多個變數。這種設計讓字串切片(常見的 "文字"
字面值)可以在程式中輕量、高效地使用與傳遞,同時保有 Rust 的記憶體安全保障。
📚 參考文件:Rust Book - References and Borrowing