基于enum输入返回不同类型的泛型函数
问题描述:
我有一个保存寄存器的结构。我希望我的read_register
函数为Register::V0
和Register::V1
返回u8
,但u16
为Register::V2
和Register::V3
。我不知道如何使通用的输入类型的函数。我收到错误match arms have incompatible types
,这是合理的,因为类型是不同的。基于enum输入返回不同类型的泛型函数
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),
}
}
我希望有一个答案,但我很好,返回枚举 –