为什么通过 `use some_crate::derive_foo` 导入自定义导出 Foo 不起作用?

fly*_*eep 3 macros rust rust-macros

我想使用使用属性的自定义派生宏。对于 Rust 2015,我写道:

\n\n
#[macro_use]\nextern crate pest_derive;\n\n#[derive(Parser)]\n#[grammar = "grammar.pest"]\npub struct MyParser;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用edition = \'2018\',extern crate已被弃用,因此macro_use不可用。我以为我可以写use pest_derive::{grammar,derive_parser};,但我必须写use pest_derive::*;

\n\n

如何避免全局导入?pest_derive 板条箱的代码非常简单,我不知道*导入什么必要的东西是 \xe2\x80\x99tderive_parsergrammar

\n\n
#[macro_use]\nextern crate pest_derive;\n\n#[derive(Parser)]\n#[grammar = "grammar.pest"]\npub struct MyParser;\n
Run Code Online (Sandbox Code Playgroud)\n

She*_*ter 5

这是导入派生的错误语法。您导入派生的名称,而不是基础函数。在这种情况下,use pest_derive::Parser

use pest_derive::Parser;

#[derive(Parser)]
#[grammar = "grammar.pest"]
pub struct MyParser;
Run Code Online (Sandbox Code Playgroud)

或者

#[derive(pest_derive::Parser)]
#[grammar = "grammar.pest"]
pub struct MyParser;
Run Code Online (Sandbox Code Playgroud)

这个问题也不是 Rust 2018 特有的。Rust 1.30 及更高版本允许您像这样导入宏。