ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Rust] 2.programing guessing game
    rust 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;
                }
            }
        }
    
    }

     

     

Designed by Tistory.