gpt4 book ai didi

generics - 如何将泛型指定为 "don' t care”?

转载 作者:行者123 更新时间:2023-11-29 08:18:03 25 4
gpt4 key购买 nike

我有一个特性,可以为微 Controller 指定允许的引脚配置:

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>>>,
)
{
}

我的想法是我只实现微 Controller 允许的配置。

我真的不关心 PINMODEx,它们的存在使得这个特性的使用变得复杂,因为即使对于值为 None 的元组槽,我也有通过一个非常丑陋和复杂的模式:

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

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

最佳答案

如果您想要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();
}

关于generics - 如何将泛型指定为 "don' t care”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54432827/

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