底線變數
本集目標
用底線 _ 開頭的變數名來告訴編譯器「我知道這個沒用到,別唸我」。
正文
Rust 的編譯器很貼心(有時候有點煩),如果你宣告了一個變數但沒有使用它,它會給你一個警告:
fn main() {
let x = 5;
// 沒有用到 x
}
程式還是能跑,但那個黃色的警告看了就不舒服。怎麼消除呢?
方法一:加底線前綴
在變數名前面加一個底線 _:
fn main() {
let _x = 5;
// 沒有用到 _x,但編譯器不會警告了
}
這樣編譯器就懂了:「喔,你是故意不用的,好吧。」
注意,_x 還是一個正常的變數,你想用的話還是可以用:
fn main() {
let _x = 5;
println!("{}", _x); // 還是可以用
}
方法二:單獨的底線 _
如果你連名字都不想取,就直接用一個底線:
fn main() {
let _ = 42;
}
這代表「我完全不在乎這個值」。沒有名字,你之後也沒辦法用它。
_x vs _ 的差別
_x:有名字,值會被保留,之後還能用_:沒名字,值馬上就丟掉了
大部分情況下用哪個都行。
for 迴圈也能用底線
上一章學了 for i in 0..5,迴圈變數 i 會依序是 0, 1, 2, 3, 4。但如果你只是想重複做某件事五次,根本不在乎現在是第幾次呢?這時候就可以用 _:
fn main() {
for _ in 0..5 {
println!("重複五次!");
}
}
for _ in 0..5 的意思是「跑五次,但我不需要知道目前是第幾次」。
實際用途:猜數字
來看一個稍微完整一點的例子——讓玩家挑戰在五次以內猜中一個數字:
fn main() {
let secret = 67;
let mut success = false;
println!("猜一個 1~100 的數字:");
for _ in 0..5 {
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("讀取失敗");
let guess = input.trim().parse::<i32>().expect("請輸入數字");
if guess == secret {
success = true;
break;
}
println!("沒猜中......");
}
if success {
println!("恭喜你在五次內猜中了!");
} else {
println!("五次都沒猜中......");
}
}
猜中的話:
猜一個 1~100 的數字:
50
沒猜中......
70
沒猜中......
67
恭喜你在五次內猜中了!
五次都沒猜中的話:
猜一個 1~100 的數字:
50
沒猜中......
75
沒猜中......
60
沒猜中......
80
沒猜中......
90
沒猜中......
五次都沒猜中......
這裡 for _ in 0..5 代表「最多猜五次」,我們不需要知道現在是第幾次,只需要讓迴圈跑五次就好。猜對了就把 success 設成 true 然後 break 跳出迴圈。
重點整理
- 變數沒用到時,Rust 編譯器會警告你
- 在變數名前面加
_(像_x)可以消除警告 - 單獨的
_代表「我完全不在乎這個值」 _x還能用,_不能用- 不需要迴圈變數的話,寫
for _ in 0..5可以單純重複五次