Day 6:String 與 &str 的關係

學習目標

  • 分清 String(擁有)與 &str(借用)
  • 熟練兩者轉換
  • 明白該何時用哪一種

今日重點

String vs &str

String &str
所有權 擁有資料 借用資料
可變 可變 不可變
生命週期 獨立 綁定來源
例子 String::from("hi") "hi", &str

轉換

// &str -> String
let s: String = "hello".to_string();
let s: String = String::from("hello");

// String -> &str
let s = String::from("hello");
let slice: &str = &s;

當參數:用 &str 最彈性

fn greet(name: &str) {
    println!("Hello, {}!", name);
}

fn main() {
    greet("Alice");                      // 直接丟字面值
    let s = String::from("Bob");
    greet(&s);                           // &String 自動轉 &str
}

拼接

let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = format!("{}{}", s1, s2);        // 最通用

String + &strs1 + &s2 會 move 掉 s1,用 format! 較安全。

練習

fn main() {
    let words = vec!["apple", "orange", "banana"];
    // 1. 把 words join 成 "apple, orange, banana"

    // 2. 寫函式,接受 &str,回傳它的字元和
    fn char_sum(s: &str) -> usize { s.chars().count() }
    let s = String::from("héllo");
    println!("{}", char_sum(&s));   // 注意 Unicode 字元數
}

自我檢查

  • 能分辨 String 和 &str 的所有權差異
  • 熟練兩者互相轉換
  • 知道參數用 &str 最彈性
  • 注意 Unicode:用 .chars() 而不是 .len() 數「字元」

深入連結

  • The Book 第 8 章「Storing UTF-8 Encoded Text with Strings」