Day 5:切片(Slices)

學習目標

  • 理解切片是一段連續資料的「借用視圖」
  • 熟悉字串切片與陣列切片
  • 學會 &str&String 的關係

今日重點

字串切片

let s = String::from("hello world");
let hello = &s[0..5];    // "hello"
let world = &s[6..11];   // "world"
println!("{} {}", hello, world);

簡寫形式

let slice = &s[..5];    // 從頭:"hello"
let slice = &s[6..];    // 到結尾:"world"
let slice = &s[..];     // 全部:"hello world"

陣列切片

let numbers = vec![1, 2, 3, 4, 5];
let slice = &numbers[1..3];   // [2, 3]
println!("Slice: {:?}", slice);

用切片當參數(&str)

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &byte) in bytes.iter().enumerate() {
        if byte == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}

練習

  1. String::from("apple,pineapple") 切片出 "apple""pineapple"
  2. 寫一個 last_word(s: &str) -> &str 回傳最後一個字。
  3. &str 當參數,讓它同時接受 &String&str 兩者(提示:傳 &s 即可自動轉)。

自我檢查

  • 知道切片是「借用」,不擁有所有權
  • 能用 [start..end] 切字串與陣列
  • 理解 &str 可同時綁定 String 與字串字面值

深入連結

  • The Book 第 4 章「The Slice Type」