2장 - 기초적인 흐름 제어

if/else if/else

  • 조건문에 괄호가 없음
  • 일반적인 관계 연산자와 논리 연산자가 그대로 동작
    • ==!=<><=>=!||&&
fn main() { let x = 42; if x < 42 { println!("42보다 작다"); } else if x == 42 { println!("42와 같다"); } else { println!("42보다 크다"); } }

loop

  • loop 무한 루프
  • break 루프 탈출
fn main() { let mut x = 0; loop { x += 1; if x == 42 { break; } } println!("{}", x); }

while

  • while 조건이 false인 경우, 반복문 종료
fn main() { let mut x = 0; while x != 42 { x += 1; } }

for

  • .. 연산자는 시작 숫자에서 끝 숫자 전까지의 숫자들을 생성하는 반복자 생성
  • ..= 연산자는 시작 숫자에서 끝 숫자까지의 숫자들을 생성하는 반복자 생성
fn main() { for x in 0..5 { println!("{}", x); } for x in 0..=5 { println!("{}", x); } }

match

  • switch 구문과 유사
  • match의 조건은 빠짐 없이 모든 케이스를 처리해야 함
  • match와 분해의 조합은 현재까지 Rust에서 가장 흔하게 사용하는 패턴
fn main() { let x = 42; match x { 0 => { println!("0 발견"); } // 여러 개 값과 대조할 수 있다 1 | 2 => { println!("1 또는 2 발견!"); } // 범위로 대조할 수 있다 3..=9 => { println!("3에서 9까지의 숫자 발견"); } // 찾은 숫자를 변수에 바인딩할 수 있다 matched_num @ 10..=100 => { println!("10에서 100까지의 숫자 {} 발견!", matched_num); } // 모든 케이스가 처리되지 않았을 경우 반드시 존재해야 하는 기본 match _ => { println!("뭔가 다른거 발견!"); } } }

loop에서 값 리턴하기

  • loop에서 break과 동시에 값을 리턴
fn main() { let mut x = 0; let v = loop { x += 1; if x == 13 { break "13 찾았다"; } }; println!("loop에서: {}", v); }

블록 표현에서 값 리턴하기

  • ifmatch, 함수, 그리고 범위 블록은 모두 고유의 값 리턴 방식을 갖고 있음
  • 블록의 마지막 구문에 ;가 없다면 Rust는 그 값을 블록의 리턴 값으로 간주
  • if 구문을 간단한 3항 연산자처럼 쓸 수도 있음
fn example() -> i32 { let x = 42; // Rust의 3항 연산 표현 let v = if x < 42 { -1 } else { 1 }; println!("if로부터: {}", v); let food = "햄버거"; let result = match food { "핫도그" => "핫도그다", // 리턴문 하나 뿐이라면 중괄호는 필수가 아님 _ => "핫도그가 아니다", }; println!("음식 판별: {}", result); let v = { // 이 범위 블록은 함수 범위를 더럽히지 않고 값을 가져오게 해준다 let a = 1; let b = 2; a + b }; println!("block에서: {}", v); // Rust에서 함수 마지막에 값을 리턴하는 관용적 표현 v + 4 } fn main() { println!("function에서: {}", example()); }

The Rust Programming Language 링크