gpt4 book ai didi

rust - 你可以在没有语法变量的 Rust 宏中使用可选参数吗?

转载 作者:行者123 更新时间:2023-12-05 05:36:29 24 4
gpt4 key购买 nike

在 Rust 宏中使用可选参数 $(...)? 我希望能够更改结构的制定方式。例如:

struct Field<T>(T);
struct OptionalField<T>(T);

define_struct!(StructName => {
field_one: i32,
field_two?: i32
});

// would ideally evaluate to

struct StructName {
field_one: Field<i32>,
field_two: OptionalField<i32>
}

编写具有重复部分的宏并不是困难的部分,但给我带来麻烦的部分是如何使可选问号更改用作结构字段类型的类型。到目前为止,我已经试过了:

macro_rules! define_struct {
($name:ident => {
$($field_name:ident$(?)?: $type:ty),*
}) => {
struct $name {
$($field_name: $(Optional)?Field<$type>),*
}
};
}

宏调用很好并且遵循定义的模式,但是在 Field 标识符之前插入 Optional 被证明是困难的。 $(Optional)? 部分抛出错误:

attempted to repeat an expression containing no syntax variables matched as repeating at this depth
|
| $($field_name: $(Optional)?Field<$type>),*
| ^^^^^^^^^^

有没有什么方法可以根据可选宏模式的存在插入关键字,而无需使用语法变量?

最佳答案

你可以用 incremental tt muncher 来做到这一点和 push-down accumulation :

macro_rules! define_struct {
(@fields $name:ident { $($fields:tt)* } $field_name:ident?: $type:ty, $($rest:tt)*) => {
define_struct!(@fields
$name {
$($fields)*
$field_name: OptionalField<$type>,
}
$($rest)*);
};
(@fields $name:ident { $($fields:tt)* } $field_name:ident: $type:ty, $($rest:tt)*) => {
define_struct!(@fields
$name {
$($fields)*
$field_name: Field<$type>,
}
$($rest)*);
};
(@fields $name:ident { $($fields:tt)* }) => {
struct $name { $($fields)* }
};

($name:ident => { $($fields:tt)* }) => {
define_struct!(@fields $name {} $($fields)*);
};
}

Playground

关于rust - 你可以在没有语法变量的 Rust 宏中使用可选参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73299606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com