fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let guess = String::new();
}new(){:rust}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();
}mut{:rust}makes 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>{:rust}will take user's input, append it to the specified bufferResult->enum Result<T, E> { Ok(T), Err(E) }{:rust}
$ 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{:rust}, imports theRng{:rust}trait from therand{:rust}crate into the current scope.
Comparing Variables
Comparing variables
pub enum Ordering { Less, Equal, Greater }{:rust}
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!"),
};
}guess{:rust}variable 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{:rust}, handling the return type of Ordering using Match Expression
$ cargo run
Guess the number!
The secret number is: 71
Please input your guess.3 more lines
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.5 more lines
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: `targetdebugguessing-game.exe` (exit code: 101)Exception Handling
parse{:rust}function looks something likefn parse<F>(&self) -> Result<F, F::Err>{:rust}- 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;
},
};
}
}