首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust宏奇怪错误

Rust宏奇怪错误
EN

Stack Overflow用户
提问于 2017-12-28 13:22:24
回答 1查看 474关注 0票数 2

我正在处理rust的宏系统,试图在柴油上创建一个ORM包装器。通过归属表,我发现rust发送了一个相当意外的错误。请考虑以下代码:

代码语言:javascript
复制
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();
}

此代码将产生以下结果:

代码语言:javascript
复制
error: expected expression, found `Neat`
  --> macro.rs:27:31
   |
27 |                       $temp { ..Default::default() }
   |   

为什么rust说它需要一个表达式而不是整洁?我可以将此代码更改为以下代码,此示例中的所有内容都将编译并运行:

代码语言:javascript
复制
Neat { ..Default::default() }

这是不是一个编译器错误,当程序按预期运行时插入"Neat“?谢谢,为这主要是代码而道歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-28 14:22:04

在宏扩展中,$temp出现在不同的上下文中。作为fn $belong_field(&self) -> $temp中的类型和$temp { ..Default::default() }中的结构构造函数。

您已经将$temp标记为一个类型,它可以防止第二次使用。

替换行

代码语言:javascript
复制
$belong_field:ident : $temp:ty [ $key:expr ],

使用

代码语言:javascript
复制
$belong_field:ident : $temp:ident [ $key:expr ],

允许代码编译。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48001987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档