struct A {
x: i64,
}
macro_rules! foo {
($T:ty) => {
fn test() -> $T {
$T { x: 3 }
}
}
}
foo!(A);
error: expected expression, found `A`
8 | $T { x: 3 }
我知道我可以使用ident
,但我不知道为什么我不能使用$T {}
。
答案 0 :(得分:3)
由于Foo
中的Foo { bar: true }
不是类型。类型类似于i32
或String
,当然,还有类似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 }
}
}
}