首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类型约束应用于泛型函数的与特征相关的类型

将类型约束应用于泛型函数的与特征相关的类型
EN

Stack Overflow用户
提问于 2020-08-07 14:23:27
回答 1查看 790关注 0票数 1

我正在为Rust中的STM32 cortex微控制器开发一个应用程序,使用与embedded_hal接口兼容的硬件抽象层--特别是stm32f4xx-hal

我想实现一个详细的读取函数,它打印在通用串行端口上接收到的内容,并在发生错误时提供额外的消息。

我的初稿是这样的:

代码语言:javascript
复制
fn read<T: embedded_hal::serial::Read<u8>>(port: &mut T) {
    match nb::block!(port.read()) {
        Ok(byte) => hprintln!("received {}", byte),
        Err(hal::serial::Error::Overrun) => hprintln!("Overrun Error"),
        Err(_) => hprintln!("Unknown error"),
    }.ok();
}

不幸的是,编译器抱怨它无法将串行Error枚举与与Read特性关联的Error类型协调起来:

代码语言:javascript
复制
error[E0308]: mismatched types
  --> src/peripherals/cctalk.rs:95:13
   |
93 |     match nb::block!(port.read()) {
   |           ----------------------- this expression has type `core::result::Result<u8, <T as embedded_hal::serial::Read<u8>>::Error>`
94 |         Ok(byte) => hprintln!("received {}", byte),
95 |         Err(hal::serial::Error::Overrun) => hprintln!("Overrun Error"),
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found enum `stm32f4xx_hal::serial::Error`
   |
   = note: expected associated type `<T as embedded_hal::serial::Read<u8>>::Error`
                         found enum `stm32f4xx_hal::serial::Error`
help: consider constraining the associated type `<T as embedded_hal::serial::Read<u8>>::Error` to `stm32f4xx_hal::serial::Error`
   |
92 | fn read<T: embedded_hal::serial::Read<u8, Error = stm32f4xx_hal::serial::Error>>(port: T) {
   | 

在这一点上,我认为为该特性指定一个附加约束是合适的:

代码语言:javascript
复制
fn read<T: embedded_hal::serial::Read<u8>>(port: &mut T) {
// Read::Error must be equal to hal::serial::Error
where <T as embedded_hal::serial::Read<u8>>::Error = hal::serial::Error,
{
    match nb::block!(port.read()) {
        Ok(byte) => hprintln!("received {}", byte),
        Err(hal::serial::Error::Overrun) => hprintln!("Overrun Error"),
        Err(_) => hprintln!("Unknown error"),
    }.ok();
}

此时,错误指出where子句中不支持等式约束(尚未)

代码语言:javascript
复制
error: equality constraints are not yet supported in `where` clauses
  --> src/peripherals/cctalk.rs:94:1
   |
94 | <T as embedded_hal::serial::Read<u8>>::Error = hal::serial::Error,
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not supported
   |
   = note: see issue #20041 <https://github.com/rust-lang/rust/issues/20041> for more information
help: if `Error` is an associated type you're trying to set, use the associated type binding syntax
   |
94 | T: embedded_hal::serial::Read<u8, Error = hal::serial::Error>,
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在这里,我有限的铁锈经验不足。我明白我应该以某种方式更清楚地知道embedded_hal::serial::Read<u8>::Errorhal::serial::Error是一样的,但我不确定(如果可能的话)怎么做。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 07:23:58

尽管特质Read没有为其Error设置参数,但可以使用以下语法约束关联的Error类型:

代码语言:javascript
复制
                                      /*Associated types can be referred
                                        to between angular braces like this,
                                        similarly to struct fields.*/
fn read<T: embedded_hal::serial::Read<u8, Error = hal::serial::Error>>(port: &mut T)
// ...

(在编写本报告时,rustc 1.45.0)无法在相应的where子句中处理此要求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63303748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档