Rust supports macros, which allow for language extensions that go beyond what functions can achieve. For instance, the assert_eq!
macro, commonly used in testing, provides more than a function can. When an assertion fails, the macro generates an error message that includes the file name and line number, something that functions cannot do. Macros work differently, as they are expanded during compilation, replacing the macro call with Rust code.
함수가 할 수 있는 범위를 넘어선 언어적 확장
예를 들어, 테스트에서 자주 사용하는 assert_eq!
매크로는 함수가 할 수 없는 일을 한다. 단언이 실패하면 파일 이름과 줄 번호가 포함된 오류 메시지를 생성하는데, 이는 함수로는 불가능하다.
매크로는 함수와 다르게 동작하며, 컴파일 시 매크로 호출이 러스트 코드로 확장된다.
왜 매크로가 하는 일을 함수가 할수 없다고 하는거야?
Macros act like shorthand. During compilation, each macro call is expanded into Rust code before types are checked or machine code is generated. For instance, the assert_eq!
macro expands into a match expression, and if the assertion fails, it triggers a panic!
macro to generate a failure message at runtime. This is different from C++ macros, which are prone to errors. Rust macros are safer, use pattern matching, and are easier to maintain.
assert_eq!
매크로는 매치 표현식으로 확장되며, 단언이 실패하면 런타임에서 panic!
매크로가 실패 메시지를 생성한다. 이는 오류가 많았던 C++ 매크로와는 다르며, 러스트 매크로는 더 안전하고 패턴 매칭을 사용해 유지보수가 용이하다.In this chapter, we’ll explore how to write macros using simple examples and walk through the design of a more advanced macro that embeds JSON literals into programs. Macros in Rust are defined using macro_rules!
, which operates entirely through pattern matching. The assert_eq!
macro, for example, can use different delimiters like parentheses, square brackets, or curly braces without affecting the functionality.
이 장에서는 간단한 예제를 통해 매크로 작성법을 배우고, JSON 리터럴을 프로그램에 직접 삽입하는 고급 매크로의 설계 과정을 살펴본다. 러스트에서 매크로는 macro_rules!
를 사용하여 정의되며, 이는 전적으로 패턴 매칭을 통해 작동한다. assert_eq!
매크로는 괄호, 대괄호, 중괄호 등 다양한 구분자를 사용할 수 있으며, 기능에 아무런 영향을 미치지 않는다.
Macro Basics
macro_rules!
is the main way to define macros in Rust. Note that there is no !
after assert_eq
in this macro definition: the !
is only included when calling a macro, not when defining it.