マクロのデメリット
たとえば マクロ を使うと DSL を作れるが、コードを理解・保守する人は Rust だけではなく DSL も(マクロ内の実装も含めて)理解する必要がある e.g. http_codes! の場合、Status という enum を作るが、DSL からはそれが分からない また、マクロ内のコードは Rust の構文的慣習に従わないため、rustfmt でフォーマットされない e.g.
code:rs
macro_rules! square {
{ $e:expr } => {
{
let x = $e;
x*x // x * x とフォーマットされない
}
}
}
http_codes! の場合、Informational などの Group enum のバリアントが使われているが、接頭辞(Group::)も付いていないし、use も用いていない
コンパイラによるエラーメッセージも、必ずしもどのマクロがどのマクロを呼び出しているのか、どこで問題が発生したのかを詳細に追跡するわけではない
1 行のマクロ呼び出しが数百行のコードを生成する場合もあるが、呼び出し元からは分からない
そのため、呼び出しが不要になった場合でも削除されずに残り続ける可能性が高い