我有这个代码,我试图提炼到它最基本的本质:

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的测试双打,这样我就可以自信地清理凌乱的代码 .

如果我以错误的方式攻击这个总体目标,我当然会感谢被指向更好的策略 .