为什么Rust的if-else AST使用不同的类型呢?

时间:2016-07-11 16:14:22

标签: rust

当我发现Rust使用不同类型来表示然后Block)和 else Expr时,我正在编写Rust lint插件)iflibsyntax::ast::ExprKindlibrustc::hir::Expr_语句的部分内容。

我需要他们两个都有共同的类型。

我应该只使用hir::Expr_::ExprBlock上的明确匹配,否则部分可能是其他内容,我需要进行更智能的比较?

来自the source

// ...
pub enum Expr_ {
    // ...
    /// An `if` block, with an optional else block
    ///
    /// `if expr { block } else { expr }`
    ExprIf(P<Expr>, P<Block>, Option<P<Expr>>),
    // ...
}
// ...

1 个答案:

答案 0 :(得分:7)

这是我们可以区分的

if x {
    foo();
} else if y {
    bar();
}

if x {
    foo();
} else { // note the block
    if y {
        bar();
    }
}

第一个在其他节点中有一个ExprIf - Expr而第二个有一个ExprBlock包含一个ExprIf - 表达式。