2017-05-06 162 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

我希望有一個答案,但我很好,返回枚舉 –