Как обозначить общий тип как «все равно»? - PullRequest
0 голосов
/ 30 января 2019

У меня есть черта, которая обозначает разрешенные конфигурации выводов для микроконтроллера:

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 голосов
/ 30 января 2019

Если вам нужна реализация по умолчанию для черты TimChannelsMapping, вы можете создать структуру по умолчанию (DefaultTimChannelsMapping) или реализовать ее даром ().

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

Или если вы хотитеабстрагируясь от None s вашего кортежа, вы можете создать 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();
}
...