2014-12-05 70 views
1

我正在實施我自己的serialize::{Encoder,Decoder}。在serialize::Encoder中有emit_enum_struct_variant方法。我想知道什麼樣的對象會觸發這種方法。std:serialize中的結構變體枚舉是什麼?

我想它的對象是這樣的:

struct Point { 
    x: int, 
    y: int, 
} 

enum MyEnum { 
    StructValue(Point), 
} 

裏面居然爲了觸發這些方法:

emit_enum(name=MyEnum) 
emit_enum_variant(v_name=StructValue,v_id=0,len=1) 
emit_enum_variant_arg(a_idx=0) 
emit_struct(name=Point,len=2) 
emit_struct_field(f_name=x,f_idx=0) 
emit_struct_field(f_name=y,f_idx=1) 

回答

2

枚舉結構變異是這種形式的枚舉變種:

enum MyEnum { 
    StructValue { x: int, y: int } 
} 

也就是說,枚舉變體不像元組結構,而是一個常規結構。當enum變體擁有多於幾個字段,或者在語義上更正確時(例如,包含相同類型的幾個字段的變體),這種變體偶爾會有用。

+0

對不起,這個小問題。 '''emit_tuple_struct'''呢?我試過調用'''''''''''struct'TupleStruct(uint,bool);''''''''。 – Jarod 2014-12-06 02:54:13

+0

我剛剛檢查過,實際上''[derive(Decodable,Encodable)]'使用'emit_struct' /'read_struct'而不是'emit_tuple_struct' /'read_tuple_struct'。我不知道它爲何發生的原因,也許可以在包含'#[deriving(Encodable,Decodable)]''''''''''''的庫的git歷史記錄中找到它。 – 2014-12-06 11:54:18