依存関係でのみ使用されるマクロを使用する必要があるのはなぜですか

ピーターライオンズ

macro_useコードで直接使用されず、コードの依存関係でのみマクロを明示的に使用する必要があるのはなぜですか?

以下に示す2つのケースがあります。

  1. 依存関係でのみ使用されるマクロ
    • calldo_parsemaptakeerror_if
  2. 依存関係でのみ使用される他のスコープ名
    • parse_der_defined(関数)、fold_parsers(関数)、DerObject(構造体)、DerObjectContent(構造体)

ボーナス質問

コーディング中にこれに対処するための最良のワークフローは何ですか?コンパイラエラー、名前の追加、すすぎ、繰り返し?


// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(call, do_parse, map, take)]
extern crate nom;

// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(error_if)]
extern crate rusticata_macros;

// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(parse_der_sequence_defined, parse_der_defined, fold_parsers)]
extern crate der_parser;

// My code does not directly use these names. Why do I need to `use` them?
use der_parser::{der_read_element_header, DerObjectContent};

// Why is this necessary? My code does not directly use these names.
use nom::{Err, ErrorKind};

// I actually use these
use nom::IResult;
use der_parser::DerObject;

fn seq_of_integers(input: &[u8]) -> IResult<&[u8], DerObject> {
    parse_der_sequence_defined!(input, der_parser::parse_der_integer)
}

fn main() {
    let input = [
    0x30, // ASN.1 sequence
    0x03, // length 3 bytes
    0x02, // ASN.1 Integer
    0x01, // length 1 byte
    0x07, // 7
    ];
    let der_result = seq_of_integers(&input);
    match der_result {
        IResult::Done(_unparsed_suffix, der) => {
            assert_eq!(_unparsed_suffix.len(), 0);
            let der_objects = der.as_sequence().unwrap();
            for (index, der_object) in der_objects.iter().enumerate() {
                println!("{}: {}", index, der_object.content.as_u32().unwrap());
            }
        }
        IResult::Error(error) => {
            eprintln!("{}", error);
        }
        IResult::Incomplete(_needed) => {
            eprintln!("{:?}", _needed);
        }
    };
}
ダボロス

マクロは衛生的ですが、定義されている範囲から物事を「取り込む」ことはありません。

1つのクレートでマクロを定義し、絶対名ではなく相対名を使用する場合(マクロがder_read_element_nameではなくを使用してコードを生成する場合::der_parser::der_read_element_name)、useこれらのメソッドをスコープに含めるためにを使用する必要があります。

これに対する解決策は、マクロを定義するときに常に絶対名を使用するか、マクロスコープ内でそれらを「使用」することです。たとえば、ファイルを開くマクロがある場合、次の2つのいずれかを実行します。インポート:

macro_rules! open {
    ($file:expr) => ({
        // note: this has to be inside the macro expansion
        // `::std` means this works anywhere, not just in
        // the crate root where `std` is in scope.
        use ::std::fs::File;

        File::open($file)
    })
}

または絶対パスを直接使用します。

macro_rules! open {
    ($file:expr) => ({
        ::std:fs::File::open($file)
    })
}

他のマクロを使用するマクロでも同様のことが起こります。2つの木枠がある場合は、次のように言いますcratea

macro_rules! say_hello {
    () => (println!("hi"))
}

crateb

#[macro_use]
extern crate cratea;

macro_rules! conversation {
    () => ({
        say_hello!();
        println!("goodbye");
    })
}

次に、誰かがで使用するcratebconversation!()、文字通りに展開され、ターゲットクレートに存在しないsay_hello!(); println!("goodbye");場合say_helloエラーになります

これに対する解決策は、すべてのマクロをからcratea再エクスポートすることcratebです。これは、次の方法で実行できます。

extern crate cratea;
pub use cratea::*;

これは、に依存し#[macro_use]ている人は誰でものcratebすべてcrateaのマクロにアクセスできることを意味します。したがって、のマクロをcrateb展開してのマクロを参照するcrateaと、機能します。


ワークフローでは、個人的な逸話:

私が見つけたcargo check貨物時計私の知っているワークフローのベストであることを。cargo watchターミナルから始めます。ファイルが保存されるたびに、チェックが開始され、構文エラーが報告されます。

かなり自信があり、エラーがなくなったら、実際に実行cargo runしたりcargo test、プロジェクトに応じて実行したりします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

プロジェクトで直接使用されていない場合でも、Nugetの依存関係を追加する必要があるのはなぜですか?

分類Dev

なぜ依存関係マネージャーを使用する必要があるのですか?

分類Dev

Gradle:プロジェクトの依存関係に必要なリポジトリを追加する必要があるのはなぜですか?

分類Dev

使用している別のgemの依存関係になっているのに、gemを明示的に含める必要があるのはなぜですか?

分類Dev

(pre | post)instスクリプトで使用されるコマンドが依存関係にリストされていないのはなぜですか?

分類Dev

提供済みとしてマークされているプロジェクトの依存関係を使用するにはどうすればよいですか?

分類Dev

提供済みとしてマークされているプロジェクトの依存関係を使用するにはどうすればよいですか?

分類Dev

Fortranで「使用のみ」を使用する必要があるのはなぜですか

分類Dev

AngularCLIの依存関係-使用しないのに@angular / routerをインストールする必要があるのはなぜですか?

分類Dev

AngularCLIの依存関係-使用しないのに@angular / routerをインストールする必要があるのはなぜですか?

分類Dev

Tika、Maven、依存関係... TikaがEmptyParserを使用するのはなぜですか?

分類Dev

Electronを開発者の依存関係として保存する必要があるのはなぜですか?

分類Dev

systemd が依存関係システムを控えめに使用する必要があると言っているのはなぜですか?

分類Dev

あるプロジェクトの依存関係が既存の依存関係に置き換えられるのはなぜですか

分類Dev

Gradleの依存関係を `@ aar`として含める必要があるのはなぜですか

分類Dev

「--requirements_file」を使用すると、依存関係がGCSにアップロードされるのはなぜですか?

分類Dev

Gradleの依存関係でKaptを使用する必要があるのはいつですか?

分類Dev

gccを使用するプリコンパイル済みヘッダーを含める前に、gccの__COUNTER__マクロが展開されていないことを確認する必要があるのはなぜですか?

分類Dev

Reactフック:useEffectが依存関係の完全な配列を必要とするのはなぜですか?

分類Dev

Reactフック:useEffectが依存関係の完全な配列を必要とするのはなぜですか?

分類Dev

vuejsで、マウントされたフックを使用しているときにnextTickを使用する必要があるのはなぜですか?

分類Dev

UML図で依存関係キーワード<< use >>を使用する必要があるのはいつですか?

分類Dev

JBOSS 8(wildfly)のマニフェストへの依存関係を宣言する必要があるのはなぜですか?

分類Dev

JBOSS 8(wildfly)のマニフェストへの依存関係を宣言する必要があるのはなぜですか?

分類Dev

別の依存関係の依存関係を使用するのはなぜ悪い習慣ですか?

分類Dev

ネストされたクラスを使用する必要があるのはなぜですか?

分類Dev

IntellJ IDEAでSpring Bootプロジェクトを実行すると、依存関係がクラスパスに追加されないのはなぜですか?

分類Dev

SerializeFieldを使用する必要があるのはなぜですか?

分類Dev

SerializeFieldを使用する必要があるのはなぜですか?

Related 関連記事

  1. 1

    プロジェクトで直接使用されていない場合でも、Nugetの依存関係を追加する必要があるのはなぜですか?

  2. 2

    なぜ依存関係マネージャーを使用する必要があるのですか?

  3. 3

    Gradle:プロジェクトの依存関係に必要なリポジトリを追加する必要があるのはなぜですか?

  4. 4

    使用している別のgemの依存関係になっているのに、gemを明示的に含める必要があるのはなぜですか?

  5. 5

    (pre | post)instスクリプトで使用されるコマンドが依存関係にリストされていないのはなぜですか?

  6. 6

    提供済みとしてマークされているプロジェクトの依存関係を使用するにはどうすればよいですか?

  7. 7

    提供済みとしてマークされているプロジェクトの依存関係を使用するにはどうすればよいですか?

  8. 8

    Fortranで「使用のみ」を使用する必要があるのはなぜですか

  9. 9

    AngularCLIの依存関係-使用しないのに@angular / routerをインストールする必要があるのはなぜですか?

  10. 10

    AngularCLIの依存関係-使用しないのに@angular / routerをインストールする必要があるのはなぜですか?

  11. 11

    Tika、Maven、依存関係... TikaがEmptyParserを使用するのはなぜですか?

  12. 12

    Electronを開発者の依存関係として保存する必要があるのはなぜですか?

  13. 13

    systemd が依存関係システムを控えめに使用する必要があると言っているのはなぜですか?

  14. 14

    あるプロジェクトの依存関係が既存の依存関係に置き換えられるのはなぜですか

  15. 15

    Gradleの依存関係を `@ aar`として含める必要があるのはなぜですか

  16. 16

    「--requirements_file」を使用すると、依存関係がGCSにアップロードされるのはなぜですか?

  17. 17

    Gradleの依存関係でKaptを使用する必要があるのはいつですか?

  18. 18

    gccを使用するプリコンパイル済みヘッダーを含める前に、gccの__COUNTER__マクロが展開されていないことを確認する必要があるのはなぜですか?

  19. 19

    Reactフック:useEffectが依存関係の完全な配列を必要とするのはなぜですか?

  20. 20

    Reactフック:useEffectが依存関係の完全な配列を必要とするのはなぜですか?

  21. 21

    vuejsで、マウントされたフックを使用しているときにnextTickを使用する必要があるのはなぜですか?

  22. 22

    UML図で依存関係キーワード<< use >>を使用する必要があるのはいつですか?

  23. 23

    JBOSS 8(wildfly)のマニフェストへの依存関係を宣言する必要があるのはなぜですか?

  24. 24

    JBOSS 8(wildfly)のマニフェストへの依存関係を宣言する必要があるのはなぜですか?

  25. 25

    別の依存関係の依存関係を使用するのはなぜ悪い習慣ですか?

  26. 26

    ネストされたクラスを使用する必要があるのはなぜですか?

  27. 27

    IntellJ IDEAでSpring Bootプロジェクトを実行すると、依存関係がクラスパスに追加されないのはなぜですか?

  28. 28

    SerializeFieldを使用する必要があるのはなぜですか?

  29. 29

    SerializeFieldを使用する必要があるのはなぜですか?

ホットタグ

アーカイブ