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 |
---|