
275
5
장
도구 활용
매크로를 이렇게 작성하지 말고, 다음과 같이
Result
를 출력하는 코드를 생성하도록 작성해
보자.
/// HTTP 상태를 성공 여부를 표현하는 `Result<(), MyError>`로 변환한다.
macro_rules! check_success {
{ $e:expr } => {
match $e.group() {
Group::Successful => Ok(()),
_ => Err(MyError("HTTP operation failed")),
}
}
}
그러면 코드의 흐름을 파악하기가 훨씬 쉬워진다.
let rc = perform_http_operation();
check_success!(rc)?; // 오류 흐름을 `?`를 통해 볼 수 있다.
// ...
러스트의 선언적 매크로를 사용할 때 주의해야 할 두 번째 사항은
C
전처리기에도 똑같이 적용
되는 사항이다. 즉, 매크로의 인수가 사이드 이펙트
side
effect
가 있는 표현식으로 되어 있다면 매
크로 안에서 인수를 중복 사용하지 않도록 주의한다. 앞서 정의한
square
!
매크로는 임의의
표현식을 인수로 받은 후 그 인수를 두 번 사용하는데, 이렇게 하면 예상과 다른 결과가 발생할
수 있다.
의도하지 않은 동작 발생
let mut x = 1;
let y = square!({
x += ...