오늘 예제에서 나온 여러 메소드들을 정리하고자 한다.
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);
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!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
let s = " Hello\tworld\t";
assert_eq!("Hello\tworld", s.trim());
trim 메소드는 앞, 뒤의 공백을 모두 제거해준다.
core::str
pub fn parse<F>(&self) -> Result<F, F::Err>
where
F: FromStr,
parse는 타입을 바꿔주는 메소드다. 아래 예제를 보면 &str
인 "4"를 앞에서 지정한 u32
타입으로 바꿔주는 것을 볼 수 있다.
let four: u32 = "4".parse().unwrap();
assert_eq!(4, four);
let x: Result<u32, &str> = Ok(2);
assert_eq!(x.unwrap(), 2);
let x: Result<u32, &str> = Err("emergency failure");
x.unwrap(); // panics with `emergency failure`
unwrap은 Ok를 값으로 받으면 그 안에 있는 데이터를 꺼내주고, Err를 값으로 받으면 panic 상태가 된다.
core::cmp::Ord
pub fn cmp(&self, other: &Self) -> Ordering
cmp는 인자를 비교해주는 메소드로 Ordering 타입을 리턴하는데, 이 때 Ordering은 둘 중 하나가 많거나 적은지 혹은 같은지 알려주는 enum이다. 아래 예제를 보면 직관적으로 이해할 수 있다.
use std::cmp::Ordering;
assert_eq!(5.cmp(&10), Ordering::Less);
assert_eq!(10.cmp(&5), Ordering::Greater);
assert_eq!(5.cmp(&5), Ordering::Equal);
cmp 설명에 나오는 self
와 Self
의 차이점이 무엇인지 갑자기 궁금해졌다. stackOverflow의 친절한 답변에 따르면
self
는 self: Self
의 줄임말이다.
&self
는 self: &Self
의 줄임말이다.
&mut self
는 self: &mut Self
의 줄임말이다.
메소드 인자로 받는 Self 는 메소드의 타입을 받아올 때 좀 더 직관적으로 코딩할 수 있게 도와주는 문법적 장치다.
즉, self
는 메소드 인자 그 자체를 말하는 것이고 Self 는 받아온 메소드 인자의 타입을 말한다.