본문 바로가기
Dev/문법적 설탕

Rust: Syntactic Sugar

by 괴발짜응 2025. 2. 21.
반응형

1. 구조체 필드 축약 (Shorthand Field Initialization)

구조체의 필드 이름과 같은 이름의 변수가 있을 경우, 필드 초기화를 간단하게 작성할 수 있다.

struct Point {
  x: 132,
  y: 132,
}

fn main() {
  let x = 5;
  let y = 10;
  // 필드 이름과 변수명이 동일하므로 축약 가능
  let p = Point { x, y };
  // 위 코드는 Point { x: x, y: y }와 동일함
}

 

2. if let 및 while let

복잡한 match 구문 대신, 특정 패턴 하나만 처리할 경우에 사용하는 축약 구문.

 

if let:

fn main() {
  let maybe_value = Some(42);
  if let Some(val) = maybe_value {
    println!("Value is: {}", val);
  }
}

 

while let:

fn main() {
  let mut stack = vec![1, 2, 3];
  // 스택이 빌 때까지 반복
  while let Some(top) = stack.pop() {
    println!("Popped: {}", top);
  }
}

 

 

3. ? 연산자

에러 전파를 간결하게 작성할 수 있도록 해주는 연산자로, Result나 Option의 값을 처리할 때 내부적으로 match 구문으로 desugar 된다.

use std::fs::File;
use std::io::{self, Read};

fn read_file_contents() -> io::Result<String> {
    let mut file = File::open("foo.txt")?;  // 에러 발생 시 조기 반환
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

 

 

4. for 루프의 desugaring

Rust의 for 루프는 이터레이터를 사용하여 반복을 처리하는 축약 구문이다. 내부적으로는 이터레이터의 next()를 호출하는 loop로 변환된다.

fn main() {
  let numbers = vec![1, 2, 3, 4, 5];
  for num in numbers {
    println!("{}", num);
  }
}

 

5. 클로저 (Closure) 문법

익명 함수(클로저)를 간단하게 정의할 수 있는 문법으로, 함수형 프로그래밍 패턴을 쉽게 사용할 수 있게 해준다.

fn main() {
  let add = |a, b| a + b; // 매개변수와 본문을 간결하게 표현
  println!("2 + 3 = {}", add(2, 3));
}

 

6. async/await

비동기 프로그래밍을 위한 구문으로, 복잡한 상태 머신을 내부적으로 생성하지만 개발자는 마치 동기 코드처럼 작성할 수 있다.

use reqwest; // Cargo.toml에 reqwest 의존성을추가해야 함.

async fn fetch_data() -> Result<String, reqwest::Error> {
  let response = reqwest::get("https://www.rust-lang.org").await?;
  let body = response.text().await?;
  OK(body)
}

 

7. impl Trait 구문

함수 반환 타입이나 매개변수에 대해 구체적인 타입 대신, 특정 트레이트를 구현하는 타입임을 명시할 수 있다. 복잡한 제네릭 타입을 숨겨 코드 가독성을 높힌다. 

fn make_iterator() -> impl Iterator<Item = i32> {
    vec![1, 2, 3].into_iter()
}

fn main() {
    for num in make_iterator() {
        println!("{}", num);
    }
}

 

8. 패턴 매칭과 디스트럭처링(Destructuring)

튜플, 배열, 구조체 등 복합 자료형에서 원하는 요소를 쉽게 분해햐여 사용할 수 있게 해준다.

튜플 디스트럭처링:

fn main() {
    let point = (10, 20);
    let (x, y) = point;
    println!("x: {}, y: {}", x, y);
}

 

구조체 디스트럭처링:

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };
    let Rectangle { width, height } = rect;
    println!("width: {}, height: {}", width, height);
}

 

9. 매크로 (Macros)

매크로는 코드 생성을 자동화하는 강력한 도구로, 보일러플레이트 코드를 줄이고 자주 사용하는 패턴을 간닪게 사용할 수 있게 한다. 대표적으로 vec![], println![], format! 등이 있다.

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    println!("Numbers: {:?}", numbers);
}

 

10. Lifetime Elision 규칙

함수 서명에서 명시적으로 라이프타임을 기술하지 않아도, 컴파일러가 상황에 맞게 라이프타임을 추론하도록 하는 규칙이다. 이를 통해 코드를 훨씬 간결하게 작성할 수 있다.

fn first_word(s: &str) -> &str {
    s.split_whitespace().next().unwrap_or("")
}
반응형

'Dev > 문법적 설탕' 카테고리의 다른 글

JavaScript : Syntactic sugar  (0) 2025.02.21