我有这个代码,我试图提炼到它最基本的本质:
use std::error::Error;
pub trait I2CDevice {
type Error: Error;
}
struct MySensor<T: I2CDevice + Sized> {
Device : T
}
impl<T> MySensor<T> where T: I2CDevice + Sized {
pub fn new(dev: &mut T) {
let cal = get_calibration(dev);
let mut mySensor = &mut MySensor { Device: dev};
}
}
fn get_calibration<T: I2CDevice + Sized>(dev: &mut T) -> Calibration {
Calibration {}
}
struct Calibration {
}
但无法编译,错误:
error[E0277]: the trait bound `&mut T: I2CDevice` is not satisfied
--> src\main.rs:17:33
| 17 | let mut mySensor = &mut MySensor { Device: dev};
| ^^^^^^^^
the trait `I2CDevice` is not implemented for `&mut T`
| = note:required by `MySensor`
我觉得我在 MySensor
的impl上使用的类型约束足以限制 T
,以便它应该满足 MySensor
结构本身完全相同的约束 . 所以我被卡住了 .
I2CDevice
特质成员的要求迫使我变得可怜 .
为了给出更多背景知识,我正在尝试围绕特定的基于I2C的硬件传感器编写抽象,以便可以使用传感器而无需了解通过I2C网络与该传感器交互的细节 .
我正在使用rust-i2cdev crate定义了一个 LinuxI2CDevice
结构,该结构推动了 I2CDevice
特性,但是我自己的代码是一团糟,所以我希望在重构之前用测试来覆盖代码 . 要做到这一点,我试图用 I2CDevice
特征引用替换 LinuxI2CDevice
结构引用,这样我就可以创建也是 I2CDevice
impls的测试双打,这样我就可以自信地清理凌乱的代码 .
如果我以错误的方式攻击这个总体目标,我当然会感谢被指向更好的策略 .