Skip to content

Latest commit

 

History

History
64 lines (51 loc) · 1.62 KB

result.md

File metadata and controls

64 lines (51 loc) · 1.62 KB

Result

러스트는 Result 타입이 존재한다. 해당 타입은 성공실패의 데이터를 가지고 있다.

enum Result<T, E> {
  Ok(T),
  Err(E)
}

Option 타입과 같이 enum에 제너릭으로 값을 준다.

fn fetch(url: &str) -> Result<i32, String> {
  if url == "1ilsang.dev" {
    return Ok(200);
  }
  Err("NOT FOUND".to_owned())
}

fn main() {
  let result = fetch("1ilsang.dev");
  match result {
    Ok(200) => println!("200 OK"),
    Ok(other) => println!("Success {:?}", other),
    Err(e) => println!("Error! {:?}", e),
  }
}

에러를 try-catch가 아닌 결과 "값"으로 처리한다는 점이 흥미로웠다.

with question operator

Result를 물음표 연산자와 함께 하면 시너지가 난다.

// ? 연산자를 사용하기 위해선 반드시 Result 타입을 반환해야 한다.
fn fetch(url: &str) -> Result<i32, String> {
  if url == "1ilsang.dev" {
    return Ok(200);
  }
  Err("NOT FOUND".to_owned())
}

fn check(url: &str) -> Result<(), String> {
  let result = fetch(url)?; // ? 연산자는 Error가 발생하면 아래 행으로 내려가지 않고 throw 한다.
  println!("{:?} OK! Hello!", result);
  Ok(()) // 빈 괄호는 "유닛" 타입이라 부르며 아무것도 반환하지 않는 것과 같다.
}

fn main() {
  match check("1ilsang.d2ev") {
    Err(e) => println!("Error! {:?}", e),
    _ => (),
  }
  // Error! "NOT FOUND"
}

매번 Ok 인지 확인하지 않고 물음표 연산자로 빠르게 함수에서 탈출할 수 있다.

단, 함수 뒤에 ?를 사용하려면 반드시 Result 타입을 반환해야 한다.