Rust宏在特征定义中有效吗?

时间:2016-06-09 15:38:42

标签: rust

我可以使用宏而不是特征来构建结构和枚举。这是一个关于我失踪的特质是如何工作的错误吗?这是一个无法构建的简单示例:

macro_rules! fun{
  () => { fn hello(); }
}

macro_rules! full_fun{
  () => { fn hello(){} }
}

// Fails with:
// <anon>:13:8: 13:11 error: expected one of `const`, `extern`, `fn`, `type`, or `unsafe`, found `fun`
// <anon>:13        fun!();
macro_rules! trait_macro{
  ($name:ident) => {
     pub trait $name {
       fun!();
     }
 }; 
}

macro_rules! struct_macro{
  ($name:ident) => {
     pub struct $name;

     impl $name {
       full_fun!();
     }
 };
}

// I can add functions to a Impl
struct_macro!{Monster}
// But I cannot add functions to a trait
trait_macro!{Monster}


fn main() {

}

2 个答案:

答案 0 :(得分:1)

根据the Rust documentation on macros,宏可以扩展为:

  • 零件或多件物品
  • 零个或多个方法,
  • 表达,
  • 声明,或
  • 一种模式。

你的full_fun成为一种方法,但我认为特质中的声明并不重要。 (尽管如此,我还没有找到确切的参考资料。)

即使它是,它也无济于事:由于宏观卫生规则,定义的hello无法在其他地方引用,因为它实际上是一个与任何不同的唯一标识符其他 - 即您的fun!()宏不会声明与full_fun!()实现的功能相同的功能。

答案 1 :(得分:0)

目前不支持宏内部特征扩展。相关的AST代码:

pub enum TraitItemKind {
    Const(P<Ty>, Option<P<Expr>>),
    Method(MethodSig, Option<P<Block>>),
    Type(TyParamBounds, Option<P<Ty>>),
}

由于错误消息仅指出constexternfntypeunsafe中的一个被视为特征中的下一个标记。