如何将泛型指定为“无关”?

时间:2019-01-30 03:08:56

标签: generics rust

我有一个特征,它指定了微控制器允许的引脚配置:

pub trait TimChannelsMapping<TIM>: Sized {
    const MAPPING: u8;
}

以这种方式使用:

//TIM1
impl<PINMODE1, PINMODE2, PINMODE3, PINMODE4> TimChannelsMapping<TIM1>
    for (
        Option<PA8<Alternate<PINMODE1>>>,
        Option<PA9<Alternate<PINMODE2>>>,
        Option<PA10<Alternate<PINMODE3>>>,
        Option<PA11<Alternate<PINMODE4>>>,
    )
{
}

这个想法是我只实现微控制器允许的配置。

我并不是很在意PINMODEx,并且它们的存在使使用此特征变得很复杂,因为即使对于值为None的元组槽,我也必须通过一个相当丑陋和复杂:

let pins = (Some(a6), Some(a7), Some(b0), None::<PB1<Alternate<OpenDrain>>>);

我想指定“无关”或提供默认值的方法。

1 个答案:

答案 0 :(得分:1)

如果您想要TimChannelsMapping特性的默认实现,则可以创建默认结构(DefaultTimChannelsMapping)或不使用任何()来实现。

impl<TIM> TimChannelsMapping<TIM> for () {
    const MAPPING: u8 = 0;
}

或者,如果您想抽象出元组的None,则可以创建一个Builder

pub struct PinBuilder(
    Option<PA8<Alternate<PINMODE1>>>,
    Option<PA9<Alternate<PINMODE2>>>,
    Option<PA10<Alternate<PINMODE3>>>,
    Option<PA11<Alternate<PINMODE4>>>,
);

impl PinBuilder {
    pub fn new() -> Self {
        Self(None, None, None, None)
    }

    pub fn pa8(mut self, pa8: Option<PA8<Alternate<PINMODE1>>>) -> Self {
        self.0 = pa8;
        self
    }

    pub fn build(
        self,
    ) -> (
        Option<PA8<Alternate<PINMODE1>>>,
        Option<PA9<Alternate<PINMODE2>>>,
        Option<PA10<Alternate<PINMODE3>>>,
        Option<PA11<Alternate<PINMODE4>>>,
    ) {
        (self.0, self.1, self.2, self.3)
    }
}

fn main() {
    let pins = PinBuilder::new().pa8(Some(a6)).build();
}