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

底線變數

本集目標

用底線 _ 開頭的變數名來告訴編譯器「我知道這個沒用到,別唸我」。

正文

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 可以單純重複五次