Introduction
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let guess = String::new();
}-
new()is an associative function, other languages call it static methods -
In Rust, variable are immutable by default
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
}mutmakes this variable mutable
Using IO
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}pub fn read_line(&self, buf: &mut String) -> io::Result<usize>will take user's input, append it to the specified bufferResult->enum Result<T, E> { Ok(T), Err(E) }
$ cargo run
Guess the number!
Please input your guess.
22
You guessed: 22Using rand Package
- Using the
randpackage to generate random numbers
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=101);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}use rand::Rng, imports theRngtrait from therandcrate into the current scope.
Comparing Variables
Comparing variables
pub enum Ordering { Less, Equal, Greater }
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess: String = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse().expect( "Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
};
}guessvariable is declared twice, i.e. called Shadowing (specially used in converting type of variables, but preserving the same variable name)
Match Expression
fn cmp(&self, other: &u32) -> Ordering, handling the return type of Ordering using Match Expression
$ cargo run
Guess the number!
The secret number is: 71
Please input your guess.
51
You guessed: 51
Too small!Loops
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=101);
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess: String = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse().expect("Please type a number!");
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;
},
};
}
}️🐞
Bug: Error when user inputs string type
$ cargo run
Guess the number!
The secret number is: 67
Please input your guess.
drip
thread 'main' panicked at src/main.rs:21:47:
Please type a number!: ParseIntError { kind: InvalidDigit }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\guessing-game.exe` (exit code: 101)Exception Handling
parsefunction looks something likefn parse<F>(&self) -> Result<F, F::Err>- Using match expression to catch the error
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=101);
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess: String = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("Please enter a number.");
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;
},
};
}
}