프로젝트 생성
$ cargo new guessing
cargo.toml 파일에 rand crate 추가
... [dependencies] rand = "0.8.5"
코드
use rand::Rng; use std::{cmp::Ordering, io}; fn main() { println!("Guess the number!"); // thread_rng // OS가 seed를 정하고, 현재 스레드에서만 사용되는 난수 생성기 let secret_number = rand::thread_rng().gen_range(1..=100); loop { println!("Please input your guess:"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect("Failed to read line"); // guess 변수 섀도잉 String -> u32로. // parse 메서드는 Result 타입을 반환하며 Result는 Ok, Err를 가진 열거형. let guess: u32 = match guess.trim().parse() { Ok(num) => num, // 변환 성공시 u32 값 반환 Err(_) => continue, // 변환 실패시 루프의 처음부터 재실행 }; println!("Your guess: {guess}"); match guess.cmp(&secret_number) { // Ordering 열거형; Less, Greater, Equal 이라는 variant를 가짐. Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } }
실행
느낀점
- Rust의 타입 추론도 매우 강력했다. 두번째
guess
변수의 타입을u32
로 변환하자 자동적으로secret_number
도 type assertion으로u32
로 바꿔준다. (guess
와secret_number
를cmp
로 비교하고 있기 때문)
let secret_number = rand::thread_rng().gen_range(1..=100); 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!("Your guess: {guess}"); match guess.cmp(&secret_number) {
- 함수형 프로그래밍적인 특징을 갖추고 있어서 함수형 프로그래밍 스타일로 활용 가능할 것 같다.