io::stdin().read_line(&mut guess).expect("Failed to read line");
이제 1부터 100까지 수를 랜덤하게 만드는 예시를 해 볼것임.
Cargo의 외부 crates와의 조화는 Cargo의 매력이다!!
이제 외부 라이브러리 추가해볼 것.
cargo.toml파일 하위에 [dependencies]에 rand = "0.8.5"추가.
이때 일어나는 일?
Cargo.lock파일에 대해서 좀 더 설명하는 부분이다.
요약하자면, Cargo는 Cargo.lock파일을 보면서 "어떤 버전들을 사용할 것인지"를 파악한다.
이걸 Reproducible builds라고 하네
그럼, dependencies의 버전들을 좀 업데이트하고싶을 땐??
아래에서 나오는 updatea명령어를 통해서 할 수 있는 것임.
cargo update라는 명령어를 수행했다고 해보자.
만약 0.8.6버전이 나오고, 그 뒤에 0.9.0이 출시되었다고 하자.(현재는 0.8.5라고 가정)
cargo update를 하면 0.8.6이 될까? 0.9.0이 될까?
이건 0.8.6이 된다.
Cargo.toml 파일에서 0.9.0이라고 명시해주지 않으면 below 0.9.0을 유지한 update가 수행된다고 한다.
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=100);
println!("The secret number is: {secret_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}");
}
use rand::Rng;
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
// --snip--
println!("You guessed: {guess}");
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
use std::cmp::Ordering
match
프로그램을 실제로 돌려보면 에러가 뜰텐데, 자료형을 어떻게 해야할까? 라는 생각이 들었음.
// --snip--
let mut guess = 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를 또 사용한 것을 볼 수 있는데,
이런걸 Shadowing이라고 한다.
새로운 guess를 만드는게 아닌, 기존의 guess 변수를 재사용한다는것.
// --snip--
println!("The secret number is: {secret_number}");
loop {
println!("Please input your guess.");
// --snip--
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
}
이런식으로 loop를 사용한다.
종료조건은 어떻게 표기할까?
// --snip--
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
약간 Swift에서 클로저가 생각이 난다.
그리고 잘못된 입력은 어떻게 처리할까?
// --snip--
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {guess}");
// --snip--
이것도 마찬가지로 parse()에서 Result를 리턴하는 듯 하다.
뭔가... C++과 비슷하면서도...
또 완전 새로운 세상인 것 같다.
C++과 Swift의 문법이 섞인듯한 느낌...