为什么通过`use some_crate :: derive_foo`导入自定义派生Foo无效?

时间:2018-10-29 14:02:00

标签: macros rust rust-macros

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

#[macro_use]
extern crate pest_derive;

#[derive(Parser)]
#[grammar = "grammar.pest"]
pub struct MyParser;

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

如何避免全局导入? pest_derive板条箱的代码是very simple,我不知道*导入了什么不是derive_parsergrammar的东西。

error[E0658]: The attribute `grammar` is currently unknown to the compiler and
              may have meaning added to it in the future (see issue #29642)
  --> src/parser/mod.rs:10:3
   |
10 | #[grammar = "rst.pest"]
   |   ^^^^^^^

1 个答案:

答案 0 :(得分:4)

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

use pest_derive::Parser;

#[derive(Parser)]
#[grammar = "grammar.pest"]
pub struct MyParser;

#[derive(pest_derive::Parser)]
#[grammar = "grammar.pest"]
pub struct MyParser;

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