具有泛型类型结构值的结构
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>
.
假设我有一个使用通用类型的 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>
.