Rust 锈宏奇异错误
我正在研究rust的宏系统,试图在柴油机上制作ORM包装器。通过工作,我发现rust发送了一个相当意外的错误。请考虑以下代码:Rust 锈宏奇异错误,rust,Rust,我正在研究rust的宏系统,试图在柴油机上制作ORM包装器。通过工作,我发现rust发送了一个相当意外的错误。请考虑以下代码: macro_rules! klass { ( $name:ident, fields => ($( $field:ident : $type:ty = $default:expr, )*), belongs_to => ($( $belon
macro_rules! klass {
(
$name:ident,
fields => ($(
$field:ident : $type:ty = $default:expr,
)*),
belongs_to => ($(
$belong_field:ident : $temp:ty [ $key:expr ],
)*)
) => {
struct $name {
$( $field: $type, )*
}
impl Default for $name {
fn default() -> $name {
$name {
$(
$field : $default,
)*
}
}
}
impl $name {
$(
fn $belong_field(&self) -> $temp {
let key = $key;
$temp { ..Default::default() }
}
)*
}
}
}
klass! ( Neat,
fields => (
id: i32 = 0,
name: String = String::from(""),
),
belongs_to => ()
);
klass!( Bob,
fields => (
id: i32 = 0,
neat_id: i32 = 0,
),
belongs_to => (
neat: Neat [ "neat_id" ],
)
);
fn main()
{
let b = Bob { ..Default::default() };
let mut n = b.neat();
}
此代码将产生以下结果:
error: expected expression, found `Neat`
--> macro.rs:27:31
|
27 | $temp { ..Default::default() }
|
为什么rust说它想要一个表情而不是整洁?我可以将此代码更改为以下内容,然后编译并运行此示例中的所有内容:
Neat { ..Default::default() }
当程序按预期运行时插入Neat时,这是编译器错误吗?谢谢,很抱歉这主要是代码。$temp在宏扩展中的不同上下文中出现。作为fn$ENBERY_field&self->$temp中的类型,作为$temp{..Default::Default}中的结构构造函数
您已经将$temp标记为一个类型,它可以防止第二次使用
更换线路
$belong_field:ident : $temp:ty [ $key:expr ],
与
允许编译代码
$belong_field:ident : $temp:ident [ $key:expr ],