[解決済み] モジュールファイルをまたいでマクロを使用するには?
質問
同じクレート内の別々のファイルに2つのモジュールがあり、そのクレートには
macro_rules
を有効にしています。あるモジュールで定義されたマクロを別のモジュールで使いたいのですが。
// macros.rs
#[macro_export] // or not? is ineffectual for this, afaik
macro_rules! my_macro(...)
// something.rs
use macros;
// use macros::my_macro; <-- unresolved import (for obvious reasons)
my_macro!() // <-- how?
現在、コンパイラーエラー " に当たっています。
macro undefined: 'my_macro'
マクロシステムはモジュールシステムの前に実行されるので、これは理にかなっています。どのように私はそれを回避するのですか?
どのように解決するのですか?
同一クレート内のマクロ
新しいメソッド (Rust 1.32, 2019-01-17 以降)
foo::bar!(); // works
mod foo {
macro_rules! bar {
() => ()
}
pub(crate) use bar; // <-- the trick
}
foo::bar!(); // works
を使うと
pub use
を使用すると、マクロは他の項目と同様に使用およびインポートできます。また、旧来の方法とは異なり、ソースコードの順序に依存しないため、マクロが定義される前 (ソースコードの順序) に使用することができます。
古い方法
bar!(); // Does not work! Relies on source code order!
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
bar!(); // works
同じクレートでマクロを使用したい場合、マクロが定義されているモジュールには、属性
#[macro_use]
. なお、マクロは
の後に
の後にしか使えません。
クレートをまたぐマクロ
木枠
util
#[macro_export]
macro_rules! foo {
() => ()
}
木枠
user
use util::foo;
foo!();
この方法では、マクロは常に木箱のトップレベルに存在することに注意してください! ですから、たとえ
foo
の中にあったとしても
mod bar {}
の中にあり、その
user
クレートはまだ
use util::foo;
と
ではなく
use util::bar::foo;
. を使うことで
pub use
を使うことで、(ルートでエクスポートされるのに加えて) 木箱のモジュールからマクロをエクスポートすることができます。
Rust 2018以前は、他のクレートからマクロをインポートするには、属性に
#[macro_use]
を追加していました。
extern crate util;
ステートメントに追加します。そうすると、すべてのマクロが
util
. この構文はもう必要ないはずです。
関連
-
[解決済み] 修正方法:致命的なエラー:openssl/opensslv.h: RedHat 7 では、そのようなファイルまたはディレクトリはありません。
-
[解決済み] モジュールレイアウトバージョンの非互換性
-
[解決済み] Verilog エラー。構造ネット式に接続する必要があります
-
[解決済み] ローカルにインストールされたPythonモジュールの一覧を取得するにはどうしたらいいですか?
-
[解決済み] Pythonモジュールをアンロード(再ロード)するにはどうしたらいいですか?
-
[解決済み] PythonモジュールとPythonパッケージの違いは何ですか?
-
[解決済み] Pythonモジュールのソースの場所を見つけるにはどうしたらいいですか?
-
[解決済み] ES6 オブジェクトからすべての値をエクスポートする
-
[解決済み] モジュールファイルをまたいでマクロを使用するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン