我可以使用宏而不是特征来构建结构和枚举。这是一个关于我失踪的特质是如何工作的错误吗?这是一个无法构建的简单示例:
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() {
}
答案 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>>),
}
由于错误消息仅指出const
,extern
,fn
,type
或unsafe
中的一个被视为特征中的下一个标记。