2016-01-17 3 views

ответ

1

Я думаю, что первая проблема заключается в том, что вы действительно хотите y быть типа A, поэтому он не может иметь поле с именем c в первую очередь. y может быть A::B или A::D. Только если y является вариантом A::B, то вы можете получить объект B_ внутри варианта, а затем получить c.

Вторая проблема в вашем коде заключается в том, что вы не инициализируете y как вариант A::B. Выражение A::B имеет тип fn(B_) -> A {A::B}, который представляет собой функцию конструктора (автоматически генерируемую компилятором) для перечислений A.

Следующий код инициализации y правильно и получить c:

enum A { 
    B(B_), 
    D(D_) 
} 

enum D_ { D_1, D_2 } 

struct B_ { 
    c: Vec<i32>, 
} 

fn main() { 
    let y = A::B(B_ { c : Vec::new() }); 

    // Check if y is an A::B, so we can get the B_ object inside 
    // by deconstruction. Then we can get c. 
    if let A::B(b_) = y { 
     println!("{:?}", b_.c); 
    } 
} 

Может быть, вы думали, что A::B является своего рода B типа определяется «внутри» A, который не так, как перечислений работа Rust.

Смежные вопросы