为什么我不能使用`ty`宏匹配器来构造结构?

时间:2017-05-19 21:04:41

标签: rust

struct A {
    x: i64,
}

macro_rules! foo {
    ($T:ty) => {
        fn test() -> $T {
            $T { x: 3 }
        }
    }
}

foo!(A);

Playground

error: expected expression, found `A`
8 |             $T { x: 3 }

我知道我可以使用ident,但我不知道为什么我不能使用$T {}

1 个答案:

答案 0 :(得分:3)

由于Foo 中的Foo { bar: true }不是类型。类型类似于i32String,当然,还有类似Vec<u8>Result<Option<Vec<bool>>, String>的内容。

编写这样的代码没有任何意义:

struct A<T>(T);

fn main() {
    A<u8>(42);
}

您需要传入两者一个标识和类型:

macro_rules! foo {
    ($T1: ty, $T2: ident) => {
        fn test() -> $T1 {
            $T2 { x: 3 }
        }
    }
}

foo!(A, A);

或者您可以欺骗并使用令牌树:

macro_rules! foo {
    ($T: tt) => {
        fn test() -> $T {
            $T { x: 3 }
        }
    }
}