"该特征未针对可变泛型类型实施,'即使看起来如此

时间:2017-02-01 01:44:37

标签: unit-testing rust i2c

我已经获得了这个代码,我试图将其提炼到最基本的本质:

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

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

0 个答案:

没有答案