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 {}
。
最佳答案
因为 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);
或者您可以作弊并使用 token 树:
macro_rules! foo {
($T: tt) => {
fn test() -> $T {
$T { x: 3 }
}
}
}
关于rust - 为什么我不能使用 `ty` 宏匹配器来构造结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44078964/