-
[Rust] 2.programing guessing gamerust 2023. 1. 25. 23:56반응형
https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html
chapter 2는 가벼운 주제로 프로그래밍을 하면서 자세한 설명보다는 컨셉 정도 알수 잇는 설명이 같이잇는 형태였다.
코드랑 같이 새로웠던 내용 주석으로 적어뒀다.
/* use ~::~ 이부분은 js 에서 import 하는 부분과 역할이 같았다. std 이부분은 standard library 를 의미하며 https://doc.rust-lang.org/std/prelude/index.html 여기서 다른 모듈도 확인할수 있다. std 말고 rand 도 사용했는데 이건 외부라이브러리를 사용한거 같다. 근데 외부라이브러리를 crate 라고 부르는것 같은데 정확히는 모르겠다. */ use rand::Rng; use std::cmp::Ordering; use std::io; fn main() { println!("Guess the number"); /* rand 라이브러리의 thread_rng 라는 함수를 사용하는 표현이며 1..100 은 1~99 를 의미하며 1..=100 은 1~100을 의미한다. */ let secret_number = rand::thread_rng().gen_range(1..=100); let mut score = 0; /* 보통의 for문 이나 while문과 다르게 그냥 조건에 상관없이 무한루프용 키워드가 따로 있는것 같다. */ loop { println!("Please input your guess"); /* 변수는 기본적으로 immutable 하다 하지만 이변수는 추후에 입력값을 할당해줄 계획이기 때문에 mut 키워드를 이용해 mutable 한 변수로 사용할수 있다. String::new()은 string 내장객체(?)의 new 함수를 사용해 비어있는 string을 할당해주는 부분이다. */ let mut guess = String::new(); /* - io 모듈의 stdin함수의 read_line 메서드를 사용하여 터미널에 입력값을 가져와 guess 에 할당해주는 부분이다. - & 키워드 를 사용했는데 이는 인자가 참조형이라는 뜻이다. 따로 복사를 해서 넣지 넣지 않고 메모리주소를 넣어서 재사용 한다는데 챕터4에서 다시 다룬다고 하니 그때 자세히 봐야지. - read_line 은 결과를 반환하는데 반환타입이 Result 라는 이넘타입이며 이때 성공 이나 실패에 따라 처리를 해주거나 expect 로 실패시 처리를 따로 해줘야 빌드가 된다. */ io::stdin() .read_line(&mut guess) .expect("Failed to read line"); /* - 추후에 guess 값은 randnum 과 비교될 거기 때문에 number type 으로 변환을 해주어야한다. trim으로 공백제거 이후에 parse 해주는데 type은 u32 type 으로 파싱하는 부분이다. - 이때 결과값 역시 위와 같이 Result type 의 enum으로 반환되는경우에 expect 로 처리하거나 아래와 같이 케이스별로 코드처리를 해줘야 빌드가 된다. */ let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; /* - js 의 템플릿 리터럴과 비슷하게 아래처럼 사용한다. */ println!("You guess: {guess}"); /* - 특이한점은 ++ 와 같이 사용할수 없었다. 근데 수정하라고 친절하게 알려준다 */ score += 1; /* cmp(compare) 해서 결과처리 해주는 부분인데 match 는 js 의 switch-case문 과 비슷한 느낌인데 case를 arm 이라고 한다. Ordering 세가지 결과를 가지는 enum 이며 결과에 대한 처리를 해줘야 한다. */ match guess.cmp(&secret_number) { Ordering::Less => println!("too small"), Ordering::Greater => println!("too big"), Ordering::Equal => { println!("you win"); println!("score : {}",score); break; } } } }
'rust' 카테고리의 다른 글
[Rust] 4. ownership(2).함수와 ownership (0) 2023.01.28 [Rust] 4. ownership(1). ownership, 변수와 ownership (0) 2023.01.28 [Rust] 3. 변수, 데이터타입 (0) 2023.01.26 [Rust] 1.getting started (1) 2023.01.25 [Rust] rust를 배워보기로한 이유 (0) 2023.01.23