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

标签 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 {}

最佳答案

因为 FooFoo { 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);

或者您可以作弊并使用 token 树:

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

关于rust - 为什么我不能使用 `ty` 宏匹配器来构造结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44078964/

相关文章:

rust - 从函数返回堆分配的值?

rust - 如何将元素插入向量向量中的最后一个向量?

rust - 如何为包含字符串的类型(或任何未实现复制的类型)实现复制和克隆?

rust - 最新的可用夜间功能列表?

reflection - 反射的惯用替代

parsing - 将迭代器取消交错为两个单独的迭代器

serialization - 为什么在使用带有结构变体的枚举手动实现的序列化序列化为 TOML 时出现 UnsupportedType 错误?

arrays - 创建一个具有枚举元素大小的数组

casting - 为什么从对 c_void 指针的引用进行强制转换需要双重强制转换?

rust - 如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?