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

Cpu*_*d36 12 rust

我在写锈皮棉插件时,我发现,锈使用不同类型的代表(Block)和其他(Expr一)的部分if在这两个声明libsyntax::ast::ExprKindlibrustc::hir::Expr_.

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

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

来源:

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

llo*_*giq 7

这是我们可以区分的

if x {
    foo();
} else if y {
    bar();
}
Run Code Online (Sandbox Code Playgroud)

if x {
    foo();
} else { // note the block
    if y {
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个ExprIf在else的节点中Expr有一个 - 而第二个有一个ExprBlock包含单个ExprIf表达式.

  • 你能给出(伪)代码示例,说明这两个案例中的每个案例看起来都像`ExprIf`吗? (5认同)