---
# System prepended metadata

title: 'Basic 07 : Slice'

---

# Basic 07 : Slice

對擁有序列的資料結構而言, Slice (切片) 是保存部分連續資料的「引用」的好方法。

如我們想要找一個句子裡第一個英文單字...

```Rust=
fn get_first_word(s: &str) -> &str { // 接受字串切片並返回目標切片
    let char_arr = s.as_bytes();
    for (i, &chr) in char_arr.iter().enumerate() { // 應用 Tuple 解構
        match chr {
            b'A'..=b'Z' => {}, // A - Z
            b'a'..=b'z' => {}, // a - z
            _ => return &s[..i]
        };
    }
    &s[..]
}

fn main(){
    let mut s = String::from("I am Eroiko!");
    let sliced = get_first_word(&s);
    /* 
     * ! clear this object, this operation 
     * ! will mutate this variable, which 
     * ! is not allowed since we've use "s" 
     * ! with immutable reference one line above!
     */
    s.clear(); // error
    println!("{}", sliced);
}
```

`&str` 是 `String` 物件的「<font size=4 color=mediumSeaGreen>Slice</font>」, 可以參考有序物件的一部分, 好處在於當物件更動後, 參考的結果可以對這些變動做出反應。

由於[可變引用的變數僅允許單一可變引用或全部不可變引用](#basic-06-function), 因此上面 `s.clear()` 那行會導致錯誤, 編譯不通過。

補充一下切片的語法糖。

```Rust=
let s = String::from("Meow");

/* 正常使用 */
&s[1..3]; // "eo", 注意是左閉右開

/* 以下為語法糖 */
&s[..2]; // "Me", 省前
&s[2..]; // "ow", 略後
&s[..]; // "Meow", 都略
&s; // "Meow", 超懶
```