Search

러스트에서 매크로 사용하기

매크로란 무엇인가요?

매크로는 다른 코드를 작성하는 코드를 작성하는 것을 말합니다. 이를 메타프로그래밍이라고 합니다.
메타프로그래밍은 작성하고 유지 관리하는 코드 양을 줄이는 데 유용합니다. 이는 함수의 역할 중 하나입니다. 하지만 매크로에는 함수에 없는 추가적인 기능이 있습니다.

매크로의 종류

매크로에는 두 가지 종류가 있습니다: 선언형 매크로와 절차형 매크로입니다.

선언형 매크로

Rust에서 가장 많이 사용되는 매크로입니다. "macros by example" 또는 "macro_rules! macros"라고도합니다. 일치하는 표현식과 유사한 것을 작성할 수 있도록 합니다.
매크로를 정의하려면 macro_rules! 구문을 사용합니다. 매크로가 정의된 크레이트가 스코프에 들어올 때 이 매크로를 사용할 수 있도록 #[macro_export] 주석을 사용합니다.
선언형 매크로 구문
#[macro_export] macro_rules! <매크로 이름> { ( $( $x:expr ),* ) => { { <구현> } }; }
Rust
복사

절차형 매크로

절차형 매크로는 함수와 더 비슷합니다 (절차형의 일종입니다).
절차형 매크로는 입력으로 코드를 받아들이고, 선언형 매크로처럼 패턴을 일치시키고 코드를 다른 코드로 교체하는 대신에 그 코드를 조작하여 출력 코드를 생성합니다.
절차형 매크로에는 세 가지 유형이 있습니다.

파생 매크로

파생 매크로는 파생 속성에 대한 새로운 입력을 정의합니다. 이러한 매크로는 struct, enum 또는 union의 토큰 스트림을 제공하여 새로운 항목을 생성할 수 있습니다. 또한 매크로 보조 속성을 파생시킬 수도 있습니다.
파생 절차형 매크로 구문
extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro_derive(<파생 매크로 이름>)] pub fn 파생_매크로(_item: TokenStream) -> TokenStream { <구현> }
Rust
복사

속성과 유사한 매크로

속성과 유사한 매크로는 새로운 외부 속성을 정의할 수 있습니다. 이 속성은 extern 블록, 내장 및 트레이트 구현, 트레이트 정의를 포함한 항목에 첨부할 수 있습니다.
속성 절차형 매크로 구문
extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro_attribute] pub fn <속성 매크로 이름>(_attr: TokenStream, item: TokenStream) -> TokenStream { <구현> }
Rust
복사

함수와 유사한 매크로

함수와 유사한 절차형 매크로는 매크로 호출 연산자 (!)를 사용하여 호출되는 절차형 매크로입니다.
함수와 유사한 절차형 매크로 구문
extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro] pub fn <매크로 이름>(_item: TokenStream) -> TokenStream { <구현> }
Rust
복사

매크로 vs 함수

매크로 정의는 Rust 코드를 작성하는 것이므로 함수 정의보다 복잡합니다.
매크로 정의는 일반적으로 함수 정의보다 읽기, 이해 및 유지 관리하기가 어렵습니다.
매크로는 파일 내에서 먼저 정의하거나 스코프에 가져와야 하므로 함수와 달리 어디에서든 정의하고 어디에서든 호출할 수 있습니다.

다른 읽을 거리들