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

标签 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::*;

如何避免 glob 导入? 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"]
   |   ^^^^^^^

最佳答案

这是导入派生的错误语法。您导入派生的名称,而不是底层函数。在这种情况下,使用 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 及更高版本允许您像这样导入宏。

关于macros - 为什么通过 `use some_crate::derive_foo` 导入自定义派生 Foo 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047195/

相关文章:

c - 该行的指针解释宏

c++11 - Rust 中的 C+11 类类型衰减

Rust Trait 对象转换

C++ 宏不会替换所有值

rust - 宏扩展忽略 token `let` 和任何后续

debugging - 如何设置GDB在Windows中调试Rust程序?

rust - 具有定制包装类型的柴油机

rust - 具有三个可选参数的宏,其中一个必须接受值列表

import - Rust:找不到宏

rust - 在 macro_rules 中存储状态