在 Rust 中,类型不会从 impl 传播到结构

问题描述 投票:0回答:1

所以当我学习 Rust 时,我想在 stm32l0xx-hal 中为 uart 编写一个包装器 据了解,我不断收到的错误是 impl 中的 USART 模板与结构声明不同

代码:

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 类型

generics rust
1个回答
0
投票

问题是你对编译器撒谎:

new
块中编写的
impl
函数表示它将返回调用者
选择的任何
Uart<USART, TX, RX>(只要USART: serial::Serial2Ext<TX,RX>
) 。但随后,它不会将调用者选择的泛型类型 
_tx
 的值分配给 
UART
,而是尝试分配特定类型 
UART2
。如果 
UART
UART2
 就可以了,但是 
impl
 块没有这么说。

如果

Serial2Ext

 定义了一个关联类型,那么就可以保留泛型,这样就可以约束 
impl
(“这里的类型尚未定义,但它是任何 
Serial2Ext
说将从 
uart()
 返回给定的 
(TX, RS)
),因为它没有,所以不可能 - 不添加更多代码 - 让 
UART
 成为泛型类型 
并且。 同时使用特定类型。

最简单的方法是删除通用参数

UART

 并将其替换为特定类型 
UART2
,因为这是 
Serial2Ext::uart
Ok
 情况下将返回的内容。

© www.soinside.com 2019 - 2024. All rights reserved.