我有enums
的嵌套结构,即。 enum X
有一个包含enum Y
等的变体。如果x.y.z
不存在,是否有任何方法可以访问带有运行时错误的x.y.z
字段(例如{{1}是错误的变种)。此外,这是一个相当道德的事情,还是有更好的选择,没有x
声明无处不在?效率并不是那么重要,尽管让它尽可能便宜会很好。
答案 0 :(得分:5)
无法使用点语法访问嵌套枚举,但您可以使用if let
:
pub enum X {
A(Y),
B(Z)
}
pub enum Y {
C,
D(u32)
}
pub enum Z {
E
}
fn main() {
let x = X::A(Y::D(12));
if let X::A(Y::D(n)) = x {
println!("Got it: {}", n);
} else {
println!("Nope");
}
}
(试试here)
if let
使代码可以说比match
更简洁。当然,这与match
一样有效。
答案 1 :(得分:4)
鉴于这些定义:
enum X {
Variant(Y),
…
}
enum Y {
Variant(Z),
…
}
struct Z;
您可以将if let
用于深度模式作为一种方式:
if let X::Variant(Y::Variant(ref z) = x {
// Use z
} else { // And these two lines are,
panic!(); // of course, optional.
}
或者你可以定义方法(恐慌不是一个好主意;让这些方法返回Option
更为常见,例如在rustc_serialize的Json
枚举中所示),但它仍会留下相对丑陋的代码,可能):
impl X {
fn y(&self) -> &Y {
match *self {
Variant(ref y) => y,
_ => panic!(),
}
}
}
// Ditto for Y.z()
let z = x.y().z();