Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

매크로와 포맷 문자열

포맷 문자열

std 포맷 매크로에는 인라인 표현식을 쓸 수 있다. {expr}와 {expr:spec}은 위치 인자가 된다. 자리표시자 안의 문자열은 "{tags.join(\", \")}"처럼 리터럴의 이스케이프로 쓰고, raw 리터럴에서는 r#"{v.join("-")}"#처럼 따옴표를 그대로 쓴다.

pub fn report(name: &str, values: &[i32], tags: &[&str]):
    println!("{name} has {values.len()} values")
    println!("{tags.join(\", \")}")
    assert!(!values.is_empty(), "{values.len():>4}")

이 코드는 다음이 된다.

#![allow(unused)]
fn main() {
pub fn report(name: &str, values: &[i32], tags: &[&str]) {
    println!("{} has {} values", name, values.len());
    println!("{}", tags.join(", "));
    assert!(!values.is_empty(), "{:>4}", values.len());
}
}

자리표시자가 모두 단순 식별자, 위치, {}뿐인 문자열은 Rust 그대로 둔다. 인라인 표현식이 있는 문자열에 명시적 인자가 없으면 단순 식별자도 인자가 되어, 인자가 문자열의 순서를 따른다.

적용되는 매크로는 format!, print!, println!, eprint!, eprintln!, write!, writeln!, panic!, format_args!, todo!, unreachable!, unimplemented!이다. 이 매크로들과 assert!, assert_eq!, assert_ne!, 이들의 debug_ 형태, dbg!, vec!, matches!의 인자는 Renk 표현식이다: vec![Foo.new(); 3]은 vec![Foo::new(); 3]이다.

log::info! 같은 다른 매크로는 #[...], #![...] 속성의 내용과 마찬가지로 해석하지 않는 Rust 토큰이다.

view!

Leptos 등의 view! 본문에서 여러 줄에 걸친 { 블록은 Renk 문장을 담으므로 ;가 필요 없다. 태그, 속성, {count} 같은 한 줄 블록은 Rust 토큰으로 남는다.

view! {
    <button on:click=move |_| {
        set_count.update(|n| *n += 1)
        log::info!("clicked")
    }>
        {count}
    </button>
}

는 다음이 된다.

#![allow(unused)]
fn main() {
view! {
    <button on:click=move |_| {
        set_count.update(|n| *n += 1);
        log::info!("clicked")
    }>
        {count}
    </button>
}
}

macro_rules!

arm은 들여쓰기로 구분한다. 패턴과 본문은 Rust 토큰이며 쓴 그대로 유지된다.

macro_rules! make_message:
    ($name:expr) => format!("hello {}", $name)
    ($name:expr, $greeting:expr) =>:
        format!("{} {}", $greeting, $name)

여러 줄짜리 pattern =>: arm은 들여쓴 본문 줄을 모두 유지한다.