gpt4 book ai didi

rust - Rust宏: capture exactly matching tokens

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

我的目标是编写一个宏expand!,使得:

struct A;
struct B;
struct Mut<T>;

expand!() => ()
expand!(A) => (A,)
expand!(mut A) => (Mut<A>,)
expand!(A, mut B) => (A, Mut<B>,)
// etc
[编辑]添加了结尾逗号,以实现一致的元组语法。
到目前为止,我已经写了这个宏:
macro_rules! to_type {
( $ty:ty ) => { $ty };
( mut $ty:ty ) => { Mut<$ty> };
}

macro_rules! expand {
( $( $(mut)? $ty:ty ),* ) => {
(
$( to_type!($ty) ),*
,)
};
}
我正在努力的是捕获 mut token 。如何将其分配给变量并在宏主体中重用?一次可以处理多个 token 吗?

最佳答案

this一样?

macro_rules! expand {
(@phase2($($ty_final:ty),*),) => {
($($ty_final,)*)
};
(@phase2($($ty_final:ty),*), mut $ty:ty, $($rest:tt)*) => {
expand!(@phase2($($ty_final,)* Mut::<$ty>), $($rest)*)
};
(@phase2($($ty_final:ty),*), $ty:ty, $($rest:tt)*) => {
expand!(@phase2($($ty_final,)* $ty), $($rest)*)
};
($($t:tt)*) => {
expand!(@phase2(), $($t)*)
};
}

struct A;
struct B;
struct Mut<T>(std::marker::PhantomData<T>);

fn main() {
#[allow(unused_parens)]
let _: expand!() = ();
#[allow(unused_parens)]
let _: expand!(A,) = (A,);
#[allow(unused_parens)]
let _: expand!(mut B,) = (Mut::<B>(Default::default()),);
#[allow(unused_parens)]
let _: expand!(A, mut B,) = (A, Mut::<B>(Default::default()));
}

关于rust - Rust宏: capture exactly matching tokens,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64803611/

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