Why should add "let" ahead some mut variables the second time?

Hello,
When a variale is mutable, it can be modified. But there is a case, in which the let should be add ahead the mutable variable the second time.

use std::io;
use rand::Rng;
use std::cmp::Ordering;

fn main() {
    println!("Guess the number!");
    let secret_number=rand::thread_rng().gen_range(1..=100);
    //println!("The secreat number is: {secret_number}");
    loop{
        println!("Please input your guess.");
        let mut guess=String::new();
        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");
        let guess:u32=match guess.trim().parse(){
            Ok(num)=>num,
            Err(_)=>continue,
            };

        println!("You guessed: {guess}");
        match guess.cmp(&secret_number){
            Ordering::Less=>println!("Too small!"),
            Ordering::Greater=>println!("Too big!"),
            Ordering::Equal=>{
                println!("You win!");
                break;
            }
        }
    }
}

Why should add let in let guess:u32=match guess.trim().parse(){. The variale of guess is mutable, so the let shouldn't be added before guess, which is my opinion that is wrong. May you tell the reason?

A mutable variable can change its value, but it can't change its type. You are trying to change guess's type from String to u32, which you can't do. What you can do however is shadow the original guess (the String one) with a new variable that is also called guess (the u32 one).

7 Likes

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.