@ 綁定
本集目標
學會用 @ 在比對範圍的同時,把符合的值綁定到一個變數上。
概念說明
上一集學了 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)也行- 如果不用
@,你只知道值符合模式,但不知道具體是多少 @的概念是「把符合這個模式的值,用這個名字存起來」