我有一个保存寄存器的结构。我希望我的 read_register
函数为 Register::V0
和 Register::V1
返回一个 u8
但 u16
用于 Register::V2
和 Register::V3
。我不确定如何使函数在返回类型上通用。我收到错误 match arms have incompatible types
这确实有意义,因为类型不同。
struct Registers {
v0: u8,
v1: u8,
v2: u16,
v3: u16,
}
enum Register {
V0,
V1,
V2,
V3,
}
impl Registers {
fn read_register<T>(&self, register: Register) -> T {
match register {
Register::V0 => self.v0,
Register::V1 => self.v1,
Register::V2 => self.v2,
Register::V3 => self.v3,
}
}
}
最佳答案
你不能。
抱歉,在 Rust 中无法做到这一点。您需要依赖类型,而 Rust 没有。您或许可以返回一个 enum
的实例,它只包含两个变体(每种类型一个)。或者您可以为每个“路径”接受一个回调,让调用者决定如何解决问题。
fn read_register<FnU8, FnU16, R>(
&self,
register: Register,
with_u8: FnU8,
with_u16: FnU16,
) -> R
where
FnU8: FnOnce(u8) -> R,
FnU16: FnOnce(u16) -> R,
{
match register {
Register::V0 => with_u8(self.v0),
Register::V1 => with_u8(self.v1),
Register::V2 => with_u16(self.v2),
Register::V3 => with_u16(self.v3),
}
}
关于generics - 根据参数值返回不同类型的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816946/