iT邦幫忙

0

二、三天學一點點 Rust:來! 擁有權Ownership之五(21)

  • 分享至 

  • xImage
  •  

🧾 Rust 四種文字型別差異說明

此小節針對四種文字型別做說明,而對於字串切片則是在日後有專門的章節說明,此處仍是作為必要知道的基礎。

  1. String
    String 表示一個可增長、可變的、UTF-8 編碼的字串。
    它是一個「動態」型別,這意味著它的大小可以在執行時改變。
    String 將其資料儲存在堆積上 。這意味著程式會從堆積請求記憶體來儲存字串,使其能夠根據需要增長或縮小。  
    當你擁有一個 String 時,你就擁有已分配的堆積記憶體。當 String 離開作用域時,記憶體會自動釋放。
    範例:let mut my_string = String::from("hello");

  2. &String
    &String 是一個指向 String 的引用。
    引用允許你「借用」資料而不取得所有權。
    &String 是一個指向已經存在於其他地方(堆積上)的 String 的指標。引用本身儲存在堆疊上 。  
    使用 &String 可以避免不必要的複製和所有權轉移。
    範例:let my_string_ref = &my_string;(其中 my_string 是一個 String)

  3. str (字串切片)
    str(通常稱為「字串切片」)是一個對字串的唯讀檢視。
    它表示某個較大字串中的 UTF-8 位元組序列。
    str 本身在大多數情況下不能直接用作變數型別。這是因為它的大小在編譯時是未知的。你幾乎總是會看到它在指標後面使用,字串字面值(例如,"hello")是 str 字面值。文字直接嵌入到程式的二進位檔案中。

  4. &str
    &str 是一個指向 str 的引用。這是你使用字串切片最常見的方式。
    它是一個指向字串資料的指標。此資料可能是:

  • 在程式的二進位檔案中(對於字串字面值)。
  • String 的一部分。
  • 完全在其他地方。
  • &str 非常靈活和高效,因為它不涉及複製字串資料。
    範例:let my_str_ref: &str = "hello";

✅ 小結對比

型別 儲存位置 可否變更 所有權 範例
String 堆積(Heap) ✅ 可變 擁有者 String::from()
&String 堆積 ❌ 只讀 借用者 &String
str 常數(二進位) ❌ 不可變 靜態 "hello" 字面值
&str 指向常數區段 ❌ 只讀 借用者 let s: &str = "hi"

📚 參考文件:


📚 Copy Trait with References

以下程式碼展示了 Rust 中 Copy trait 在字串切片與參照(reference)上的應用方式,並說明為何 &str 能被複製、使用者可以安全地使用多個變數來參照同一段資料。

fn main() {
    let ice_cream = "Cookies and Cream";
    let dessert = ice_cream;
    println!("{}{}", ice_cream, dessert);
}

✅ 程式解析

  1. 字串字面值 "Cookies and Cream" 是 Rust 的 字串切片(&str,會編譯進程式的唯讀記憶體區段(binary memory)
  2. 變數 ice_cream&str,屬於一種參照型別(reference type)
  3. let dessert = ice_cream; 時,這不是 Move,而是 Copy 行為,因為 &str 實作了 Copy trait。
  4. 兩個變數 ice_creamdessert 都指向同一段資料,但彼此是獨立的參照。

🔍 Copy + &str 的條件整理

條件項目 說明
型別是否 Copy? &str 是 Copy 的
是否移動所有權? ❌ 否,只是複製參照結構
儲存位置 常數字串在 binary 中,參照資訊存在 stack 上
安全嗎? ✅ 編譯器保證參照不會比原始資料活得更久(lifetime)

✅ 小結

&str 是一種實作了 Copy trait 的參照型別,讓我們可以將它安全地賦值給多個變數。這種設計讓字串切片(常見的 "文字" 字面值)可以在程式中輕量、高效地使用與傳遞,同時保有 Rust 的記憶體安全保障。

📚 參考文件:Rust Book - References and Borrowing


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言