Rust에 익숙해질겸 백준을 풀어볼까 했는데.. 입출력에서부터 막혔다.
다른 사람이 짠 코드들을 살펴보고, 어떤 함수가 사용되었는지도 공부해 보자.
Input: 3
우선, read_line() 함수의 시그니처를 살펴보자.
pub fn read_line(&self, buf: &mut String) -> Result<usize>
“Locks this handle” : read_line이 호출될 때, 해당 I/O 핸들을 잠금(lock) 설정해 다른 쓰레드가 동시에 접근하지 못하도록 한다.
이를 통해 멀티쓰레드 환경에서 데이터 무결성을 보장한다.
“appending it to the specified buffer” : 받은 입력을 매개변수로 넣은(&mut String) 버퍼에 이어붙인다.
“ -> Result<usize, std::io::Error>” : 입력받은 데이터의 바이트 크기 혹은 에러를 반환한다.
입력이 없다면 Ok(0)을 반환한다. (EOF를 판단할 수 있다.)
.unwrap()은 Result나 Option 열거형 값을 바로 꺼내서 쓸 수 있게 해준다. 정상적인 값을 꺼내거나, 에러를 꺼내 panic!으로 코드를 종료시킨다.
1. Result 타입에서의 동작:
• Ok(T): Result가 Ok일 경우, unwrap()은 내부의 T 값을 반환합니다.
• Err(E): Result가 Err일 경우, unwrap()은 프로그램을 패닉 상태로 만들며, 패닉 메시지로 에러의 디버깅 정보를 출력합니다.
2. Option 타입에서의 동작:
• Some(T): Option이 Some일 경우, unwrap()은 내부의 T 값을 반환합니다.
• None: Option이 None일 경우, unwrap()은 프로그램을 패닉 상태로 만들며, 패닉 메시지로 "called Option::unwrap()on aNone value"를 출력합니다.
실제 프로덕션에선 .unwrap()으로 panic!을 발생시키기 보다, 적절한 에러 처리를 수행하는게 바람직하다.
Input: 1 2 3
main 블럭의 4번째 줄만 보도록 하자. Rust의 튜플은 색인을 통해 다중 바인딩이 가능하다.
나머지 내용은 다음 게시글에서 더 다뤄보도록 하겠다.