Подтвердить что ты не робот

Почему Rust if-else AST использует разные типы для того и другого?

Я писал плагин Rust lint, когда обнаружил, что Rust использует разные типы для представления , а затем (Block) и else (Expr) частей if в libsyntax::ast::ExprKind и librustc::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>>),
    // ...
}
// ...
4b9b3361

Ответ 1

Это значит, что мы можем различать

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

от

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

Первый имеет ExprIf в node else- Expr, тогда как второй имеет ExprBlock, содержащий одно выражение ExprIf.