Я думаю, что первая проблема заключается в том, что вы действительно хотите 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.