Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 锈宏奇异错误_Rust - Fatal编程技术网

Rust 锈宏奇异错误

Rust 锈宏奇异错误,rust,Rust,我正在研究rust的宏系统,试图在柴油机上制作ORM包装器。通过工作,我发现rust发送了一个相当意外的错误。请考虑以下代码: macro_rules! klass { ( $name:ident, fields => ($( $field:ident : $type:ty = $default:expr, )*), belongs_to => ($( $belon

我正在研究rust的宏系统,试图在柴油机上制作ORM包装器。通过工作,我发现rust发送了一个相当意外的错误。请考虑以下代码:

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 ],