2017-05-06 121 views
1

我有一个保存寄存器的结构。我希望我的read_register函数为Register::V0Register::V1返回u8,但u16Register::V2Register::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, 
     } 
    } 
} 

回答

4

你不能。

对不起,但在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), 
    } 
} 
+0

我希望有一个答案,但我很好,返回枚举 –