Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

@ 綁定

本集目標

學會用 @ 在比對範圍的同時,把符合的值綁定到一個變數上。

概念說明

上一集學了 range pattern:1..=5 可以比對 1 到 5 之間的值。但有個問題——比對成功後,你沒辦法知道「到底是 1、2、3、4 還是 5」,因為你只知道它在這個範圍裡。

@(at 符號)可以解決這個問題。它讓你在比對的同時,把實際的值存到一個變數裡:

fn main() {
    let age = 50;
    match age {
        n @ 0..=12 => println!("{}歲,是小孩", n),
        n @ 13..=19 => println!("{}歲,是青少年", n),
        n => println!("{}歲,是大人", n),
    }
}

n @ 0..=12 的意思是「如果值在 0 到 12 之間,就把這個值叫做 n」。這樣你就能同時做範圍檢查和取值了。

範例程式碼

fn main() {
    let age = 15;

    match age {
        n @ 0..=6 => println!("{}歲,學齡前", n),
        n @ 7..=12 => println!("{}歲,國小", n),
        n @ 13..=15 => println!("{}歲,國中", n),
        n @ 16..=18 => println!("{}歲,高中", n),
        n => println!("{}歲,已成年", n),
    }

    // 搭配 char 使用
    let ch = 'k';

    match ch {
        c @ 'a'..='m' => println!("'{}' 在字母表前半段", c),
        c @ 'n'..='z' => println!("'{}' 在字母表後半段", c),
        c => println!("'{}' 不是小寫字母", c),
    }

    // 更實用的例子:HTTP 狀態碼
    let status = 404;

    match status {
        code @ 200..=299 => println!("成功!狀態碼:{}", code),
        code @ 300..=399 => println!("重新導向,狀態碼:{}", code),
        code @ 400..=499 => println!("用戶端錯誤,狀態碼:{}", code),
        code @ 500..=599 => println!("伺服器錯誤,狀態碼:{}", code),
        code => println!("未知狀態碼:{}", code),
    }
}

@ 不只能搭配 range

@ 可以搭配任何模式,不只是 range。比如搭配 |(多個值):

fn main() {
    let day = 6;

    match day {
        d @ (1 | 3 | 5 | 7) => println!("第 {} 天,是休息日", d),
        d @ (2 | 4 | 6) => println!("第 {} 天,是工作日", d),
        d => println!("第 {} 天,不是合法的日子", d),
    }
}

d @ (1 | 3 | 5 | 7) 的意思是「如果值是 1、3、5 或 7,就把它叫做 d」。注意 | 的部分要用括號包起來。

重點整理

  • n @ 1..=5 在比對範圍的同時,把值綁定到變數 n
  • 語法:變數名 @ 模式
  • @ 可以搭配任何模式,不只是 range:d @ (1 | 3 | 5 | 7) 也行
  • 如果不用 @,你只知道值符合模式,但不知道具體是多少
  • @ 的概念是「把符合這個模式的值,用這個名字存起來」