我已经获得了这个代码,我试图将其提炼到最基本的本质:
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网络与传感器交互的细节
我正在使用定义LinuxI2CDevice
结构的rust-i2cdev crate来推导I2CDevice
特征,但是我自己的代码是一团糟,所以我希望先用测试覆盖代码重构。要做到这一点,我试图用LinuxI2CDevice
特征引用替换I2CDevice
结构引用,这样我就可以创建也是I2CDevice
impls的测试双精度,这样我就可以了自信地清理凌乱的代码。
如果我以错误的方式攻击那个总体目标,我当然会感谢被指向更好的策略。