27
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rust 2018のマクロインポート

Last updated at Posted at 2018-12-10

急に小ネタができたので、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)ではうまくいかないケースがあるようです。

うまくいくケース

最新版のserdelazy_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のチャンスかもしれません。

27
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?