将类型约束应用于与通用功能相关的性状相关类型

巴巴尼库斯

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

我想实现一个详细的读取功能,该功能可打印出通用串行端口上已收到的内容,并在出错时显示额外的消息。

我的初稿看起来像这样:

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枚举与特征Error关联类型调和Read

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

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

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子句中尚不支持相等约束(尚未)

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>,
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在这里,我对Rust的有限经验不足。我感到我应该以某种方式更清楚这embedded_hal::serial::Read<u8>::Error是一样的hal::serial::Error,但我不知道如何(如果可能的话)。我应该如何进行?

巴巴尼库斯

尽管特征Read没有为其提供参数Error,但仍可以Error使用以下语法来约束关联的类型:

                                      /*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)
// ...

(在撰写本文时为rustc1.45.0)在相应的where子句中没有任何方法可以处理此要求

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

定义通用功能类型

来自分类Dev

将非MVC相关属性应用于MVC操作

来自分类Dev

将类型类约束应用于另一个类型类的内部类型

来自分类Dev

错误:将默认类型'int * int'应用于类型推断变量时,类型约束不匹配

来自分类Dev

通用功能参数的类型推断

来自分类Dev

将std :: hash <T>专用于相关类型

来自分类Dev

将文件类型与Chrome打包应用相关联

来自分类Dev

希望将实体作为通用类型传递并提取通用功能

来自分类Dev

Java:为什么使用通用功能比将接口类型作为功能参数更好?

来自分类Dev

如何将休眠验证应用于字符类型?

来自分类Dev

是否将KnownTypeAttribute应用于对象类型?

来自分类Dev

将类型转换应用于列表:“ const”是否特殊?

来自分类Dev

将条件应用于结构并产生结构类型的列表

来自分类Dev

将类型转换应用于列表:“ const”是否特殊?

来自分类Dev

反思:将声明类的类型参数应用于字段

来自分类Dev

将约束应用于getUserMedia的音轨

来自分类Dev

如何修复协议只能用作通用约束,因为它具有 Self 或相关类型要求错误

来自分类Dev

将功能应用于groupby功能

来自分类Dev

通用类型约束仅适用于数字类型

来自分类Dev

R将相关函数应用于列表

来自分类Dev

对象相等比较打字稿。无法将对象属性应用于通用类型

来自分类Dev

无法将[]的索引应用于类型为'object'的表达式(即使类型为'dynamic')

来自分类Dev

使用Scala宏将类型构造函数应用于生成的类型参数

来自分类Dev

如何将范式从模板类型应用于其他类型

来自分类Dev

将混合类型(可能是适用类型)的参数应用于函数的最佳方法

来自分类Dev

RequestBody应用于太多类型参数

来自分类Dev

方法不能应用于给定类型

来自分类Dev

在Haskell中,如何将约束附加到参数新类型,以便它们自动应用于使用它的任何类实例?

来自分类Dev

类型相关的隐式

Related 相关文章

  1. 1

    定义通用功能类型

  2. 2

    将非MVC相关属性应用于MVC操作

  3. 3

    将类型类约束应用于另一个类型类的内部类型

  4. 4

    错误:将默认类型'int * int'应用于类型推断变量时,类型约束不匹配

  5. 5

    通用功能参数的类型推断

  6. 6

    将std :: hash <T>专用于相关类型

  7. 7

    将文件类型与Chrome打包应用相关联

  8. 8

    希望将实体作为通用类型传递并提取通用功能

  9. 9

    Java:为什么使用通用功能比将接口类型作为功能参数更好?

  10. 10

    如何将休眠验证应用于字符类型?

  11. 11

    是否将KnownTypeAttribute应用于对象类型?

  12. 12

    将类型转换应用于列表:“ const”是否特殊?

  13. 13

    将条件应用于结构并产生结构类型的列表

  14. 14

    将类型转换应用于列表:“ const”是否特殊?

  15. 15

    反思:将声明类的类型参数应用于字段

  16. 16

    将约束应用于getUserMedia的音轨

  17. 17

    如何修复协议只能用作通用约束,因为它具有 Self 或相关类型要求错误

  18. 18

    将功能应用于groupby功能

  19. 19

    通用类型约束仅适用于数字类型

  20. 20

    R将相关函数应用于列表

  21. 21

    对象相等比较打字稿。无法将对象属性应用于通用类型

  22. 22

    无法将[]的索引应用于类型为'object'的表达式(即使类型为'dynamic')

  23. 23

    使用Scala宏将类型构造函数应用于生成的类型参数

  24. 24

    如何将范式从模板类型应用于其他类型

  25. 25

    将混合类型(可能是适用类型)的参数应用于函数的最佳方法

  26. 26

    RequestBody应用于太多类型参数

  27. 27

    方法不能应用于给定类型

  28. 28

    在Haskell中,如何将约束附加到参数新类型,以便它们自动应用于使用它的任何类实例?

  29. 29

    类型相关的隐式

热门标签

归档