2017-06-16 7 views
1

structのために#[derive()]の特性を実装する手続き型マクロを作成しようとしています。生成された実装コードでは、AnyMapを使用する必要があります。クレートをconstブロックにインポートする

複数のクレートのインポートを避け、他のクレートのコード(つまりSerde)で読み取った内容に基づいて、生成したコードをconst _IMPL_xxx_FOR_xxx :() = { /* generated code */ };ブロックに入れますが、コンパイルに失敗します。

error[E0432]: unresolved import `anymap::AnyMap` 
--> src/main.rs:3:9 
    | 
3 |  use anymap::AnyMap; 
    |   ^^^^^^^^^^^^^^ Maybe a missing `extern crate anymap;`? 

error[E0432]: unresolved import `anymap::AnyMap` 
--> src/main.rs:9:9 
    | 
9 |  use anymap::AnyMap; 
    |   ^^^^^^^^^^^^^^ Maybe a missing `extern crate anymap;`? 

はそれAnyMapに特有の問題である:以下

は、私は次のコード

const BLOCK_1:() = { 
    extern crate anymap; 
    use anymap::AnyMap; 
}; 

const BLOCK_2:() = { 
    extern crate anymap; 
    use anymap::AnyMap; 
}; 

fn main() { 
    println!("foo"); 
} 

私は取得しています、コンパイルエラーと私の問題を再現することができたのですか?私が使用しているパターンが推奨されていない場合は、手続き型マクロコードを生成する多分異なるアプローチを含め、これを(修正する方法を知っていますか?

答えて

2

を私は単純に

const A:() = { 
    extern crate core; 
    use core::option::Option; 
}; 

fn main() {} 
を使用して遊び場でこれを複製することができます

はしかし、それだけでuse文が壊れて表示され、私はまだコアからのアイテムを使用することができますが、私は明示的に毎回それらに名前を付ける必要があります:

const A:() = { 
    extern crate core; 
    do_stuff!(core::option::Option) 
}; 

理由はuse文は、通常の相対パスを想定していることですあなたがいるブロックに明示的に名前を付ける方法はありません(selfは残念ながら現在のモジュールを参照しています)。

これまでの説明のとおり、Rustはselfを使用して現在のモジュールを参照しているため、コードブロックにモジュールを入れてuseステートメントの参照selfを使用するだけです。

あなたのケースでは、それは次のようになります。手続きマクロのため、この作品を作る特定の問題に

const BLOCK_1:() = { 
    mod inner { 
     extern crate anymap; 
     use self::anymap::AnyMap; 
    } 
}; 
+0

これらの要素@Djzinをありがとう。したがって、実際に使用が壊れている場合、手続き型マクロを使用するときにインポートを管理する最良の方法は何ですか? – Boris

+0

あなたができることの1つは、あなたのコードをモジュールに入れて、 'use self :: anymap :: Anymap'を使ってインポートすることです。あなたはまだconst delarationの中にモジュールを置くことができます – Djzin

+0

ありがとう。私はそれを試してみる – Boris

0

を、提案された解決策は、(派生マクロを含むクレートの一部として必要なクレートを再輸出することでしたかのようなものを使用してエクスポートしようとしているクラスを含むもの)use <my_crate>::anymap::AnyMap;

関連する問題