因此,当我学习 rust 时,我想在 stm32l0xx-hal 中为 uart 编写一个包装器,我一直收到的错误是 impl 中的 USART 模板与 struct 声明不同
代码:
pub struct Uart<USART, TX, RX> {
_tx: serial::Tx<USART>,
_rx: serial::Rx<USART>,
_tx_pin: TX,
_rx_pin: RX
}
impl<USART: serial::Serial2Ext<TX,RX>, TX, RX> Uart<USART, TX,RX> {
pub fn new
(usart: USART, mut rcc: rcc::Rcc, tx_pin: TX, rx_pin: RX) -> Self {
let serial = usart
.usart(tx_pin, rx_pin, serial::Config::default(), &mut rcc)
.unwrap();
let (tx, rx) = serial.split();
Uart{
_tx : tx, // <- error
_rx : rx, // <- error
_tx_pin : tx_pin,
_rx_pin : rx_pin
}
}
}
错误:
error[E0308]: mismatched types
--> src/uart.rs:28:19
|
17 | impl<USART: serial::Serial2Ext<TX,RX>, TX, RX> Uart<USART, TX,RX> {
| ----- expected this type parameter
...
28 | _tx : tx,
| ^^ expected `Tx<USART>`, found `Tx<USART2>`
|
= note: expected struct `stm32l0xx_hal::serial::Tx<USART>`
found struct `stm32l0xx_hal::serial::Tx<stm32l0xx_hal::serial::USART2>`
stm32l0xx_hal::serial::USART2
- 是我传递给新函数的 usart 类型
问题在于你对编译器撒了谎: -function
new
在其impl
-block 中写明它将返回调用者Uart<USART, TX, RX>
选择的任何值(只要)。但是,它不会将其分配给调用者选择的泛型类型的值,而是尝试分配特定类型。如果是,那将起作用,但-block 并未说明这一点。USART: serial::Serial2Ext<TX,RX>
_tx
UART
UART2
UART
UART2
impl
如果定义了关联类型,那么就可以保留泛型
Serial2Ext
,这样就可以约束impl
(“此处的类型尚未定义,但它是给定 的Serial2Ext
返回值)。由于没有定义,所以无法做到这一点。因此,如果不添加更多代码,就不可能同时使用泛型和特定类型。uart()
(TX, RS)
UART
最简单的方法是删除通用参数
UART
并将其替换为特定类型UART2
,因为这就是-caseSerial2Ext::uart
中返回的内容Ok
。