如何在Rust的macro_rules中消除带有Vec的类型的歧义< T>?

ffscu2ro  于 2022-11-12  发布在  Mac
关注(0)|答案(1)|浏览(120)

假设我有

macro_rules! tipey {
    (Vec<$pt: ty>) => {2};
    ($pt: ty) => {1};
}

macro_rules! structy {
    (struct $i: ident { $($p: ident : $(Vec<)? $pt: ty $(>)?,)+ }) => {
        const v: &[usize] = &[ $(tipey!($pt)),+ ];
    };
}

structy!(
    struct ContentDetails {
        pattern: String,
        fields: Vec<String>,
    }
);

我不想以某种方式来消除类型的歧义,并知道它是Vec〈〉还是简单类型。我只处理Vec,所以如果不可能,就不需要扩展。我遇到的问题是,如果我只将Vec<bool>$t: ty进行匹配,那么我以后就不能将其拆分,以查看$t是否是Vec〈〉但是如果我试图收集多个tt或其他东西,那么解析属性列表就会中断。

rfbsl7qr

rfbsl7qr1#

这对于一般类型和一般Rust语法来说是非常不可靠的。但是如果你有一个非常窄的用例,那么你可以像这样修改你的代码:

macro_rules! tipey {
    (Vec<$pt: tt>) => { 2 };
    ($pt: tt) => { 1 };
}

macro_rules! structy {
    (struct $i: ident { 
        $($p: ident: $pt: tt $(<$gt: tt>)?),+
        $(,)?
    }) => {
        const v: &[usize] = &[ $(tipey!( $pt $(<$gt>)?)),+ ];
    };
}

相关问题