我有一个特征,它指定了微控制器允许的引脚配置:
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>>>);
我想指定“无关”或提供默认值的方法。
答案 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();
}