急に小ネタができたので、Rustその2 Advent Calendar 2018の11日目です。
はじめに
Rust 2018ではマクロのインポートを以下のようにマクロ名を指定して書くことができるようになりました。
// Rust 2015
#[macro_use]
extern crate bar;
// Rust 2018
use bar::baz;
fn main() {
baz!();
}
ということで、手元のプロジェクトを片っ端から書き換えてみたところ、
現時点(2018/12/10)ではうまくいかないケースがあるようです。
うまくいくケース
最新版のserde
やlazy_static
など有名どころは問題ないです。
use lazy_static::lazy_static;
use serde_derive::{Deserialize, Serialize}
古いバージョンを使っている場合はアップデートしましょう。
うまくいかないケース
例えばerror_chain
の0.12.0では
use error_chain::error_chain;
とすると以下のエラーになります。
error: cannot find macro `error_chain_processing!` in this scope
これは#[macro_use]
では当該クレートの全マクロをインポートしていたのが、マクロ名指定になったことで
error_chain!
マクロ内で使われているヘルパーマクロが見つからなくなったためです。
これを解決するにはLocal helper macrosに書いてある通りライブラリを修正する必要があり、
ユーザコードで対応するならヘルパーマクロを1個づつ書いていくしかありません。
さすがにそれは問題あるので、ライブラリが対応するまでは#[macro_use]
を使った方がいいでしょう。
ちなみに以下のコードは通りますが、この場合マクロ以外も含めて全てインポートされるので
何か衝突した場合は回避できません。
use error_chain::*;
error_chain
の場合はすでにIssueもPRも立っているので近いうちに対応するはずですが、
マイナーなクレートで未対応なものはPRのチャンスかもしれません。