具有泛型类型结构值的结构

Struct that has a value of a struct with a generic type

假设我有一个使用通用类型的 struct(BNO055 是一个传感器):

pub struct BNO055<T: I2CDevice + Sized> {
    pub i2cdev: T,
    pub mode: BNO055OperationMode,
}

我还有另一个 struct 将 BNO055 作为字段:

pub struct IMU {
    device: bno055::BNO055
}

尝试编译此代码导致错误,编译器提示:

error[E0107]: wrong number of type arguments: expected 1, found 0
   --> src/modules/sensors/imu.rs:553:13
    |
553 |     device: bno055::BNO055
    |             ^^^^^^^^^^^^^^ expected 1 type argument

如果我向 struct 添加泛型类型,如下所示:

pub struct IMU<D: I2CDevice + Sized>{
    device: bno055::BNO055<D>
}

然后impl一个函数:

impl<D: I2CDevice + Sized> IMU<D> {
    pub fn init(imu_addr: u16) -> Self {
        let mut i2c_dev = LinuxI2CDevice::new("/dev/i2c-1", imu_addr).unwrap();
        let mut imu_dev = bno055::BNO055::new(i2c_dev).unwrap();

        IMU {
            device: imu_dev
        }
    }
}

我收到这个错误:

error[E0308]: mismatched types
   --> src/modules/sensors/imu.rs:567:21
    |
567 |             device: imu_dev
    |                     ^^^^^^^ expected type parameter, found struct `modules::sensors::imu::bno055::i2cdev::linux::LinuxI2CDevice`
    |

imu_dev 属于 BNO055 类型,所以我认为它应该适合泛型的约束。我该如何解决这个错误?

这个 init() 函数应该为调用者指定的任何 D 创建一个 IMU<D> 实例(前提是 D 满足 I2CDevice + Sized 边界) :

impl<D: I2CDevice + Sized> IMU<D> {
    pub fn init(imu_addr: u16) -> Self {

...但它总是尝试 return 一个 IMU<LinuxI2CDevice>.

(edit) 在我的测试中,error[E0308]: mismatched types 在其后的注释中进行了解释,应该如下所示:

note: expected type `......::BNO055<D>`
         found type `......::BNO055<LinuxI2CDevice>`

(/编辑)

要解决此问题,您可以制作 init() non-generic,例如通过将 impl 更改为 impl IMU<LinuxI2CDevice>.

P.S。您将 BNO055 称为 "type" 并尝试将其用作类型...我不确定术语,但请注意,在将结构定义为对某些类型参数 D,结构名称本身并不代表具体类型,而是一系列相关但不兼容的类型。您必须提供某种类型来代替 D:另一个类型参数 BNO055<T> 或特定类型 BNO055<LinuxI2CDevice> - 以获得类型。

请记住使用泛型的替代方法:将 I2CDevice 设为枚举或将其保留为特征,但将其用作 trait object,例如pub i2cdev: Box<dyn I2CDevice>.