2016-08-04 53 views
1

我有一個序列基本鏽類型BERT格式下面的代碼:結構功能,可以讓任何類型的

pub struct Serializer; 

pub trait Serialize<T> { 
    fn to_bert(&self, data: T) -> Vec<u8>; 
} 

impl Serializer { 

    pub fn new() -> Serializer { 
     Serializer{} 
    } 

    pub fn term_to_binary<T: Any + Debug>(&self, data: T) -> Vec<u8> { 
     self.to_bert(data) 
    } 

    pub fn generate_term(&self, tag: BertTag, data: Vec<u8>) -> Vec<u8> { 
     let mut binary = vec![tag as u8]; 
     binary.extend(data.iter().clone()); 
     binary 
    } 

    pub fn convert_string_to_binary(&self, data: &str) -> Vec<u8> { 
     let binary_string = data.as_bytes(); 
     let binary_length = binary_string.len() as u8; 
     let mut binary = vec![0u8, binary_length]; 
     binary.extend(binary_string.iter().clone()); 
     binary 
    } 

    pub fn merge_atoms(&self, atom_1: Vec<u8>, atom_2: Vec<u8>) -> Vec<u8> { 
     let mut binary: Vec<u8> = atom_1.clone(); 
     binary.extend(atom_2.iter().clone()); 
     binary 
    } 

    pub fn get_bert_atom(&self) -> Vec<u8> { 
     let binary_string = self.convert_string_to_binary(BERT_LABEL); 
     self.generate_term(BertTag::Atom, binary_string) 
    } 
} 

impl Serialize<u8> for Serializer { 
    fn to_bert(&self, data: u8) -> Vec<u8> { 
     self.generate_term(BertTag::SmallInteger, vec![data]) 
    } 
} 

impl Serialize<bool> for Serializer { 
    fn to_bert(&self, data: bool) -> Vec<u8> { 
     let boolean_string = data.to_string(); 
     let binary_boolean = self.convert_string_to_binary(&boolean_string); 

     let bert_atom = self.get_bert_atom(); 
     let boolean_atom = self.generate_term(BertTag::Atom, binary_boolean); 

     self.merge_atoms(bert_atom, boolean_atom) 
    } 
} 

有如何正確地實施在防鏽語言方面term_to_binary功能在其中的主要問題,我們可以通過一些基本類型(如整數,布爾值等)。我能不知何故在term_to_binary獲取某些數據時,能夠「隨時」獲取某種類型的功能並撥打特定功能的電話號碼?

之後,我想寫幾個測試,這讓我確信所有工作正常。例如,它可以是這樣的:

#[cfg(test)] 
mod test { 
    use super::{Serializer}; 

    #[test] 
    fn test_serialize_bool() { 
     let serializer = Serializer::new(); 

     println!(serializer.term_to_binary(true), [100, 0, 4, 116, 114, 117, 101]) 
    } 
} 

對於整數,映射,元組測試用例將看起來非常相似。

+1

請考慮更改您的示例,以便編譯它。我會建議刪除不必要的方法。對於'term_to_binary',你可以寫'self.to_bert(data)'作爲註釋並調用'未實現!()'。 – malbarbo

回答

2

看着term_to_binary的實施,您正在嘗試撥打self.to_bert(data),即Serialize::to_bert(&self, data)。爲了能夠做到這一點的呼叫,Self(即Serializer)必須實現Serialize<T>,所以我們必須添加此綁定到term_to_binary

pub fn term_to_binary<T>(&self, data: T) -> Vec<u8> 
    where Self: Serialize<T> 
{ 
    self.to_bert(data) 
} 

您可以添加新的序列化類型T實施Serialize<T> for Serializer,可能在不改變Serializer ,這是great

請注意,使用Any將需要動態分派,但對於您的示例,這不是必需的,因此您不需要支付此成本。

+0

太棒了!感謝您的精彩提示! – Relrin