匹配较少的样板

时间:2015-07-02 06:52:41

标签: rust

我有enums的嵌套结构,即。 enum X有一个包含enum Y等的变体。如果x.y.z不存在,是否有任何方法可以访问带有运行时错误的x.y.z字段(例如{{1}是错误的变种)。此外,这是一个相当道德的事情,还是有更好的选择,没有x声明无处不在?效率并不是那么重要,尽管让它尽可能便宜会很好。

2 个答案:

答案 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();